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