需求:需要将枚举类型的字段例如enable(是否启用)转化为enable:1,enableName:是。这种形式返回给前台。

思路:在bean字段上加上枚举类型的注解,通过字段的值和枚举类反射获取枚举的key和value。

枚举注解:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* <p>Title:用于bean字段枚举类型的注解</p>
* <p>Description:</p>
* @author zhy
* @date 2019/02/27
* @version 1.0
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IEnum {
String name() default "";//名称
Class<?> clas();//枚举实体
//byte defaultKey() default 0;//默认值
}

枚举接口:(这个也可以不要,预留以防万一要用到)

/**
*
* <p>Title:</p>
* <p>Description:</p>
* @author zhy * @version 1.0
*/
public interface EnumBase { public String getName(Byte key);
}

枚举类

public enum OEnable implements EnumBase {
TRUE(1, "启用"),FALSE(0, "停用"); private Byte key; private String name; private OEnable(int key,String name) {
this.key = (byte)key;
this.name = name;
} public Byte getKey() {
return key;
} public void setKey(Byte key) {
this.key = key;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String getName(Byte key) {
for (OEnable enable : values()) {
if(key == null)
return null;
if (enable.getKey().equals(key)) {
return enable.getName();
}
}
return null;
} }

所有bean的基类,里面包含bean的基本属性。只有当结果集list里的类继承于这个类,我们才需要转换枚举值

import java.util.Date;

/**
*
* <p>Title:所有bean基类</p>
* <p>Description:</p>
* @author zhy * @version 1.0
*/
public class BeanBase { protected Integer pkey;//主键 protected Date createdTime;//创建时间 protected Date updatedTime;//更新时间 protected Integer rowVersion;//版本号 public Integer getPkey() {
return pkey;
} public void setPkey(Integer pkey) {
this.pkey = pkey;
} public Date getCreatedTime() {
return createdTime;
} public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
} public Date getUpdatedTime() {
return updatedTime;
} public void setUpdatedTime(Date updatedTime) {
this.updatedTime = updatedTime;
} public Integer getRowVersion() {
return rowVersion;
} public void setRowVersion(Integer rowVersion) {
this.rowVersion = rowVersion;
} }

Test类

public class Test extends BeanBase {

    public String name;

    @IEnum(clas = OEnable.class)
public Byte enable; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Byte getEnable() {
return enable;
} public void setEnable(Byte enable) {
this.enable = enable;
} }

bean转换工具类,通过反射获取字段信息,注解信息

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.alibaba.fastjson.JSONObject;
public class BeanUtils { /**
*
* <p>Title:bean字段转换类</p>
* <p>Description:</p>
* @author zhy * @version 1.0
* @param result
* @return
*/
public static List<Map<String,Object>> ListBeanToJson(List<? extends BeanBase> result) {
List<Map<String,Object>> newResult = new ArrayList<Map<String,Object>>();
for (BeanBase t : result) {
Map<String, Object> tmap = beanToMap(t); newResult.add(tmap);
}
return newResult;
} @SuppressWarnings("unchecked")
public static Map<String, Object> beanToMap(BeanBase t) {
Map<String,Object> tmap = new HashMap<String,Object>();
List<Field> fieldList = new ArrayList<>() ;
Class<? extends BeanBase> class1 = t.getClass();
while (class1 != null) {//取父类属性
fieldList.addAll(Arrays.asList(class1 .getDeclaredFields()));
class1 = (Class<? extends BeanBase>) class1.getSuperclass(); //父类
} try {
for (Field field : fieldList) {
field.setAccessible(true);
IEnum EnumBase = field.getAnnotation(IEnum.class);
Object key = field.get(t);//获取字段值
if (EnumBase != null) {//如果有注解
Class<?> clas = EnumBase.clas();
Method getName = clas.getDeclaredMethod("getName", Byte.class);//调用getName方法
if (key != null) {//值不为空,调用枚举类方法
Object[] oo = clas.getEnumConstants();
Object invoke = getName.invoke(oo[0],key);
tmap.put(field.getName(), key);
tmap.put(field.getName() + "Name", invoke);
}else {
tmap.put(field.getName(), key);
tmap.put(field.getName() + "Name", null);
}
}else {//没注解填入原本的值
tmap.put(field.getName(), key);
} }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return tmap;
} public static JSONObject beanToJson(BeanBase t) {
Map<String, Object> beanToMap = beanToMap(t);
JSONObject result = new JSONObject();
for (String key : beanToMap.keySet()) {
result.put(key, beanToMap.get(key));
}
return result;
}
}

结果集类Result

import java.util.List;

import com.github.pagehelper.PageInfo;
public class Result {
private boolean success;
private String code;
private String message;
private Object result; public Result() {
this.success = true;
this.code = "00000000";
this.message = "success";
this.result = "";
} public Result(boolean success, String code, String message, Object result) {
this.success = success;
this.code = code;
this.message = message;
this.result = result;
} public Result(Object result) {
this.success = true;
this.code = "00000000";
this.message = "success";
this.result = result;
} public Result(boolean success, String code, String message, List<? extends BeanBase> result) {
this.success = success;
this.code = code;
this.message = message;
this.result = BeanUtils.ListBeanToJson(result);
} public Result(List<? extends BeanBase> result) {
this.success = true;
this.code = "00000000";
this.message = "success";
this.result = BeanUtils.ListBeanToJson(result);
} public Result(BeanBase result) {
this.success = true;
this.code = "00000000";
this.message = "success";
this.result = BeanUtils.beanToJson(result);
} public Result(boolean success, String code, String message, BeanBase result) {
this.success = success;
this.code = code;
this.message = message;
this.result = BeanUtils.beanToJson(result);
} public Result(String code, String message) {
this.success = false;
this.code = code;
this.message = message;
this.result = "";
} public boolean isSuccess() {
return this.success;
} public void setSuccess(boolean success) {
this.success = success;
} public String getCode() {
return this.code;
} public void setCode(String code) {
this.code = code;
} public String getMessage() {
return this.message;
} public void setMessage(String message) {
this.message = message;
} public Object getResult() {
return this.result;
} public void setResult(Object result) {
this.result = result;
}
}

准备完毕,可以写Controller进行测试了

@RestController
@RequestMapping("/")
public class TestRest { @RequestMapping("/test")
public Result getTestList() {
Test test1 = new Test();
test1.setPkey(1);
test1.setName("测试1");
test1.setCreatedTime(new Date());
test1.setEnable((byte) 1); Test test2 = new Test();
test2.setPkey(2);
test2.setName("测试2");
test2.setCreatedTime(new Date());
test2.setEnable((byte) 2); Test test3 = new Test();
test3.setPkey(3);
test3.setName("测试3");
test3.setCreatedTime(new Date());
test3.setEnable((byte) 1); Test test4 = new Test();
test4.setPkey(4);
test4.setName("测试4");
test4.setCreatedTime(new Date());
test4.setEnable((byte) 2); List<Test> list = new ArrayList<>();
list.add(test1);
list.add(test2);
list.add(test3);
list.add(test4); return new Result(list);
} }
@RestController
@RequestMapping("/")
public class TestRest { @RequestMapping("/test")
public Result getTestList() {
Test test1 = new Test();
test1.setPkey(1);
test1.setName("测试1");
test1.setCreatedTime(new Date());
test1.setEnable((byte) 1); Test test2 = new Test();
test2.setPkey(2);
test2.setName("测试2");
test2.setCreatedTime(new Date());
test2.setEnable((byte) 2); Test test3 = new Test();
test3.setPkey(3);
test3.setName("测试3");
test3.setCreatedTime(new Date());
test3.setEnable((byte) 1); Test test4 = new Test();
test4.setPkey(4);
test4.setName("测试4");
test4.setCreatedTime(new Date());
test4.setEnable((byte) 2); List<Test> list = new ArrayList<>();
list.add(test1);
list.add(test2);
list.add(test3);
list.add(test4); return new Result(list);
} }

返回前端结果

{
"code": "00000000",
"message": "success",
"result": [
{
"updatedTime": null,
"rowVersion": null,
"enable": 1,
"name": "测试1",
"createdTime": 1552440256286,
"enableName": "启用",
"pkey": 1
},
{
"updatedTime": null,
"rowVersion": null,
"enable": 2,
"name": "测试2",
"createdTime": 1552440256286,
"enableName": null,
"pkey": 2
},
{
"updatedTime": null,
"rowVersion": null,
"enable": 1,
"name": "测试3",
"createdTime": 1552440256286,
"enableName": "启用",
"pkey": 3
},
{
"updatedTime": null,
"rowVersion": null,
"enable": 2,
"name": "测试4",
"createdTime": 1552440256286,
"enableName": null,
"pkey": 4
}
],
"success": true
}

利用注解和反射,将Bean枚举字段的值填入相应的字段中,并转化为fastjson返回前台的更多相关文章

  1. oracle将一个表中字段的值赋值到另一个表中字段(批量)

    面积表中数据错误,现将面积表中的sfmj字段的值改为居民信息表中匹配字段的值 update (select s.name name1,s2.name name2 from simple s,simpl ...

  2. Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据

    闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...

  3. 【Java】利用注解和反射实现一个"低配版"的依赖注入

    在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...

  4. Java反射之Bean修改更新属性值等工具类

    package com.bocean.util; import java.lang.annotation.Annotation; import java.lang.reflect.Field; imp ...

  5. postgresql 将同一个字段的值组合和将多个字段的值组合

    多字段值根据连接符拼接 concat_ws(':',aaa,bbb) 单字段值根据连接符拼接 string_agg(ccc,' \r\n ') 如果要将多个字段的值拼接成一个: string_agg( ...

  6. C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性

    http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...

  7. C# 字段初始值无法引用非静态字段、方法或属性( 类内部变量初始化)

    问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 在类中  变量赋值其他变量报错? public class TestClass{  public TestClass()  {  }  pu ...

  8. java利用注解及反射做通用的入参校验

    一.原理: 1.做一个field注解,注解有两个参数:是否必填.toString之后的最大长度 2.对某个request类(或基类),使用注解标记某个字段的校验详情 3.通用的static方法,利用反 ...

  9. sql server在一个字段相同值时,另一个字段结果拼接

    如下字段红框里的信息都一样的,通过转换实现字段拼接 SELECT formmain_id,(SELECT field0040+';' FROM formson_5489 WHERE formmain_ ...

随机推荐

  1. 通过Proxool配置访问数据库的要点

    proxool 配置的时候有Proxool.properties 或者 Proxool.xml 两种方式初始化. 我的配置环境是 myEclipse10+tomcat6.0 + mysql5.0 . ...

  2. foreach遍历数组的表格

    <?php /** * * @authors Your Name (you@example.org) * @date 2017-03-17 19:06:19 * @version $Id$ */ ...

  3. EXCEL常用命令

    查找和选择:定位条件(定位空值.错误值) 选择性粘贴

  4. oracle 控制文件的重建

    目录 oracle 控制文件的重建 NORESETLOGS RESETLOGS oracle 控制文件的重建 不到最后时刻,如三个控制文件都已损坏,又没有控制文件的备份.还是不要重建控制文件,处理不好 ...

  5. 04_ThreadLocal整合事务操作

    文章导读: 本文主要讲解了如何在没有框架情况下如何解决Dao的事务问题, 重点理解Connection存放到WeakReference中为什么垃圾回收的时候Connection不回收 视频与源码下载: ...

  6. 淘宝的TProfile分析

    TProfile是一个用来抓取性能数据的工具.大概是去年的时候对其分析了一下,并将它改造成了用于分析学习开源产品时的一个trace工具(不是很完善,自己用够用).现在将之前的笔记翻出来,记录一下. 1 ...

  7. 【SDOJ 3741】 【poj2528】 Mayor's posters

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  8. cinema 4d 包括宝典 --- 改线 循环边 建模布线原则

    cinema 4d 一.视图控制与物体控制 1.摇移      alt+鼠标左键   转圈看物体  改变角度 2.平移  alt +鼠标中键      不改变角度  移动 3.推拉  alt+鼠标右键 ...

  9. Leetcode 473.火柴拼正方形

    火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到. 输入为 ...

  10. 爬虫Scrapy框架-1

    Scrapy 第一步:安装 linux: pip3 install scrapy windows: 1:pip3 install wheel ,安装wheel模块 2.下载twisted:http:/ ...