當實體類中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);
}
}
