1. 程式人生 > >當實體類中entity/DTO/VO等類中,有列舉值,應該怎麼輸出?

當實體類中entity/DTO/VO等類中,有列舉值,應該怎麼輸出?

當實體類中entity/DTO/VO等類中,有列舉值,應該怎麼輸出?

問題:

orderStatus 和 payStatus都是列舉類,並且列舉的個數達地10來個,我們不可能在模板頁面(jsp/ftl/html)等頁面進行多大10多項的if判斷,去一個一個的判斷值,假如以後隨著業務的增多,列舉個數越來越多,改怎麼辦?

 
/**訂單*/
@Data //get/set
//將值是null的資料剔除
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {

    private String orderId;

    /**買家名字**/
    private String buyerName;

    /**買家手機**/
    private String buyerPhone;

    /**買家地址**/
    private String buyerAddr;

    /**使用者openid**/
    private String buyerOpenid;

    /**訂單金額**/
    private BigDecimal buyerAmount;

    /**訂單狀態, 預設狀態0新訂單**/
    private Integer orderStatus;

    /**支付狀態, 預設狀態0等待支付**/
    private Integer payStatus;

    private Date createTimestamp;

    private Date updateTimestamp;

    List<OrderDetail> orderDetailList;

    

}

  

解決方法:

思路:

1,新建一個interface的介面類:codeEnum,其方法有一個:Integer getCode();

注意,因為每個列舉實體中都會有一個: Integer code的屬性,所以適用.

2.在建一個公用的EnumUtil公具類,將code值,和列舉類(泛型)傳入其中,並且在返回型別中對列舉進行說明,限制其必須是實現codeEnum的getCode方法

比如:<T(泛型) extends codeEnum> T 這樣就能呼叫 getCode方法

3.所有列舉類需要實現codeEnum類,及其getCode方法

大概思路有了,那麼程式碼:

codeEnum.java

public interface CodeEnum {

    Integer getCode();
}

  

 

OrderStatusEnum.java

@Getter //get/set
public enum  OrderStatusEnum implements CodeEnum {

    NEW(0, "新訂單"),
    FINISHED(1, "完結"),
    CANCEL(2, "取消");

    private Integer code;

    private String message;


    OrderStatusEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

  

 

PayStatus.java

@Getter //get
public enum  PayStatusEnum implements CodeEnum {

    WAIT(0, "等待支付"),
    SUCCESS(1, "支付完成");

    private Integer code;

    private String message;

    PayStatusEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

  

EnumUtil.java

public class EnumUtil {

    /**
     * 1.Class<T> enumClass列舉類
     * 2.<T extends CodeEnum>對列舉的說明,enumClass需要繼承CodeEnum,才能呼叫each.getCode()方法
     * @param code
     * @param enumClass
     * @param <T>
     * @return
     */
    public  static <T extends CodeEnum>T getByCode(Integer code, Class<T> enumClass)
    {
        for (T each: enumClass.getEnumConstants())
        {
            if(code.equals(each.getCode()))
            {
                return each;
            }
        }
        return null;
    }
}

  

 

然後在DTO實體類中可以這樣寫了

/**
     * 當orderDTO轉成json格式時,是多出getOrderStatusEnum欄位,
     * 此註解表示遮蔽此欄位的輸出
     **/
    @JsonIgnore
    public OrderStatusEnum getOrderStatusEnum()
    {
        return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
    }

    /**
     * 當orderDTO轉成json格式時,是多出getOrderStatusEnum欄位,
     * 此註解表示遮蔽此欄位的輸出
     **/
    @JsonIgnore
    public PayStatusEnum getPayStatusEnum()
    {
        return EnumUtil.getByCode(payStatus, PayStatusEnum.class);
    }

  

完成程式碼:

/**訂單*/
@Data //get/set
//將值是null的資料剔除
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {

    private String orderId;

    /**買家名字**/
    private String buyerName;

    /**買家手機**/
    private String buyerPhone;

    /**買家地址**/
    private String buyerAddr;

    /**使用者openid**/
    private String buyerOpenid;

    /**訂單金額**/
    private BigDecimal buyerAmount;

    /**訂單狀態, 預設狀態0新訂單**/
    private Integer orderStatus;

    /**支付狀態, 預設狀態0等待支付**/
    private Integer payStatus;

    private Date createTimestamp;

    private Date updateTimestamp;

    List<OrderDetail> orderDetailList;

    /**
     * 當orderDTO轉成json格式時,是多出getOrderStatusEnum欄位,
     * 此註解表示遮蔽此欄位的輸出
     **/
    @JsonIgnore
    public OrderStatusEnum getOrderStatusEnum()
    {
        return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
    }

    /**
     * 當orderDTO轉成json格式時,是多出getOrderStatusEnum欄位,
     * 此註解表示遮蔽此欄位的輸出
     **/
    @JsonIgnore
    public PayStatusEnum getPayStatusEnum()
    {
        return EnumUtil.getByCode(payStatus, PayStatusEnum.class);
    }

}

  

 

然後在模板渲染中可這樣:

 ${orderDTO.getOrderStatusEnum().message}

<#list orderDTOPage.content as orderDTO>
                <tr>
                    <td>
                        ${orderDTO.orderId}
                    </td>
                    <td>
                        ${orderDTO.buyerName}
                    </td>
                    <td>
                        ${orderDTO.buyerPhone}
                    </td>
                    <td>
                        ${orderDTO.buyerAddr}
                    </td>
                    <td>
                        ${orderDTO.buyerAmount}
                    </td>
                    <td>
                        ${orderDTO.getOrderStatusEnum().message}
                    </td>
                    <td>
                        ${orderDTO.getPayStatusEnum().message}
                    </td>
                    <td>
                        ${orderDTO.createTimestamp}
                    </td>
                </tr>
                </#list>

  

 

 


/**訂單*/
@Data //get/set
//將值是null的資料剔除
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {

private String orderId;

/**買家名字**/
private String buyerName;

/**買家手機**/
private String buyerPhone;

/**買家地址**/
private String buyerAddr;

/**使用者openid**/
private String buyerOpenid;

/**訂單金額**/
private BigDecimal buyerAmount;

/**訂單狀態, 預設狀態0新訂單**/
private Integer orderStatus;

/**支付狀態, 預設狀態0等待支付**/
private Integer payStatus;

private Date createTimestamp;

private Date updateTimestamp;

List<OrderDetail> orderDetailList;

/**
* orderDTO轉成json格式時,是多出getOrderStatusEnum欄位,
* 此註解表示遮蔽此欄位的輸出
**/
@JsonIgnore
public OrderStatusEnum getOrderStatusEnum()
{
return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
}

/**
* orderDTO轉成json格式時,是多出getOrderStatusEnum欄位,
* 此註解表示遮蔽此欄位的輸出
**/
@JsonIgnore
public PayStatusEnum getPayStatusEnum()
{
return EnumUtil.getByCode(payStatus, PayStatusEnum.class);
}

}