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

当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?的更多相关文章

  1. 【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

  2. 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

  3. java架构之项目结构(entity / DTO / VO)

    定义类的讲究 关系示例 定义类的讲究 ejb Enterprise JavaBean(EJB),企业javaBean.是java的核心代码,分别是会话Bean(Session Bean).实体Bean ...

  4. Java中entity(实体类)的写法规范

    在日常的Java项目开发中,entity(实体类)是必不可少的,它们一般都有很多的属性,并有相应的setter和getter方法.entity(实体类)的作用一般是和数据表做映射.所以快速写出规范的e ...

  5. Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  6. 尚硅谷面试第一季-11MyBatis中当实体类中的属性名和表中的字段名不一样怎么办

    问题: MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 解决方案: 1.写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是 ...

  7. Spring整合JPA时,为实体类添加@Entity注解时提示The type MultipartEntity is deprecated

    这个情况是由于导入错了Entity包所导致的. 按住Alt+T时,会有两个关于@Entity的提示 org.hibernate.annotations.Entity 和 javax.persisten ...

  8. idea中Entity实体中报错:cannot resolve column/table/...解决办法。

    idea中Entity实体中报错:cannot resolve column/table/...解决办法. 若idea中Entity实体中报错: cannot resolve column.... c ...

  9. Java 中的PO VO DTO BO

    PO 持久对象,数据: BO 业务对象,封装对象.复杂对象 ,里面可能包含多个类:DTO 传输对象,前端调用时传输 :VO 表现对象,前端界面展示. 当你业务足够简单时,一个POJO 也完全当做PO ...

随机推荐

  1. Centos7,配置防火墙,开启端口

    原文链接:https://blog.csdn.net/u013410747/article/details/61696178 适用于CentOS 7 64位的指令: .查看已开放的端口(默认不开放任何 ...

  2. Java常用API-高级

    ---恢复内容开始--- Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.所有类在创建对象的时候,最终找的父类就是Object. * String toStri ...

  3. xlrd、xlwt 操作excel表格详解

    转自:https://www.cnblogs.com/jiablogs/p/9141414.html python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是 ...

  4. 浅谈Log4j2日志框架及使用

    目录 1.日志框架 2.为什么需要日志接口,直接使用具体的实现不就行了吗? 3.log4j2日志级别 4.log4j2配置文件的优先级 5.对于log4j2配置文件的理解 6.对于Appender的理 ...

  5. 小C的数学问题 【单调栈】

    问题 J: 小C的数学问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 565  解决: 141 [提交] [状态] [命题人:外部导入] 题目描述 小C是个云南中医学院的大一新生,在 ...

  6. LabVIEW编程实例:如何通过TCP协议进行数据通信

    对于网络通信来说,LabVIEW平台本身提供了多种方法加以实现,如可以通过TCP协议.UDP协议.DataSocket技术.甚至远程面板通信技术等方式进行通信. 下面通过一个简单的例子,演示在LabV ...

  7. hihoCoder week23 最短路径·一

    spfa 最短路 #include <bits/stdc++.h> using namespace std; #define pb push_back #define INF 1e16; ...

  8. LuoguP3948 数据结构

    题目地址 题目链接 题解 以为这题虽然是数据随机也不至于那么水吧... 于是秉着先打部分分和暴力的原则先写了暴力和min,max为-inf和inf的特殊点,对于暴力搞了个小优化,延后的操作直接前缀和答 ...

  9. (转)PaperWeekly 第二十二期---Image Caption任务综述

    本文转自:http://mp.weixin.qq.com/s?__biz=MzIwMTc4ODE0Mw==&mid=2247484014&idx=1&sn=4a053986f5 ...

  10. Vue.extend提供自定义组件的构造器

    Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器.经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元 ...