当实体类中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);
}
}