当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?

时间:2023-03-08 17:07:51

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