当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?
当实体类中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等类中,有枚举值,应该怎么输出?的更多相关文章
- 【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动
在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...
- 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动
在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...
- java架构之项目结构(entity / DTO / VO)
定义类的讲究 关系示例 定义类的讲究 ejb Enterprise JavaBean(EJB),企业javaBean.是java的核心代码,分别是会话Bean(Session Bean).实体Bean ...
- Java中entity(实体类)的写法规范
在日常的Java项目开发中,entity(实体类)是必不可少的,它们一般都有很多的属性,并有相应的setter和getter方法.entity(实体类)的作用一般是和数据表做映射.所以快速写出规范的e ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- 尚硅谷面试第一季-11MyBatis中当实体类中的属性名和表中的字段名不一样怎么办
问题: MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 解决方案: 1.写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是 ...
- Spring整合JPA时,为实体类添加@Entity注解时提示The type MultipartEntity is deprecated
这个情况是由于导入错了Entity包所导致的. 按住Alt+T时,会有两个关于@Entity的提示 org.hibernate.annotations.Entity 和 javax.persisten ...
- idea中Entity实体中报错:cannot resolve column/table/...解决办法。
idea中Entity实体中报错:cannot resolve column/table/...解决办法. 若idea中Entity实体中报错: cannot resolve column.... c ...
- Java 中的PO VO DTO BO
PO 持久对象,数据: BO 业务对象,封装对象.复杂对象 ,里面可能包含多个类:DTO 传输对象,前端调用时传输 :VO 表现对象,前端界面展示. 当你业务足够简单时,一个POJO 也完全当做PO ...
随机推荐
- replace 将逗号替换~
var reg = new RegExp(",","g"); //"g"表示全局替换var aa="qq,ww";aa= ...
- OO课程第四次总结
终于来到了最后一次的OO作业,以博客作业的形式来终结也是极好的,回顾一下过去十六周自己的经历,感慨颇深. 测试和正确性论证 简单来说,测试的目的是将程序的代码做到全覆盖,从而确保每个分支都运行一遍,进 ...
- rabbitmq install erlang faild
我安装的时候莫名的出现这2个错误 No Presto metadata available for rabbitmq-erlangwarning: /var/cache/yum/x86_64/7/ra ...
- CEF 添加F5刷新快捷键
Keyboardcodes:https://www.androidos.net.cn/android/4.3_r1/xref/external/webkit/Source/WebCore/platfo ...
- java定时任务调度工具
一.什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的时间执行次数自动执行的任务. 二.java中常用的定时任务调度工具: Timer Quartz 2.1两者区别: Timer源自jdk ...
- topcoder srm 325 div1
problem1 link $g[i]$表示解决前$i$个的代价,那么$g[i]$是所有$g[j]+cost(j+1,i)$的最小值. import java.util.*; import java. ...
- Flask学习【第10篇】:自定义Form组件
wtforms源码流程 实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- TI 多模雷达1843毫米波雷达做自动泊车(用了8个雷达)
http://e2e.ti.com/blogs_/b/behind_the_wheel/archive/2019/01/09/how-mmwave-sensors-enable-autonomous- ...
- phpcms9-6-0 一键getshell工具
介绍 一键化python 1.py http://xxx.com,如果是批量直接运行py文件即可 待办 [] 加入对有验证码phpcms网站的支持 [] 加入批量(已完成) 说明 依赖库的安装pip ...
- Oracle 之 函数运用
NVL函数:NVL(a,b)就是判断a是否是NULL,如果不是返回a的值,如果是返回b的值 通过查询获得某个字段的合计值,如果这个值位null将给出一个预设的默认值 通过nvl 对定义值赋值的语法: ...