利用注解和反射,将Bean枚举字段的值填入相应的字段中,并转化为fastjson返回前台
需求:需要将枚举类型的字段例如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返回前台的更多相关文章
- oracle将一个表中字段的值赋值到另一个表中字段(批量)
面积表中数据错误,现将面积表中的sfmj字段的值改为居民信息表中匹配字段的值 update (select s.name name1,s2.name name2 from simple s,simpl ...
- Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...
- 【Java】利用注解和反射实现一个"低配版"的依赖注入
在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...
- Java反射之Bean修改更新属性值等工具类
package com.bocean.util; import java.lang.annotation.Annotation; import java.lang.reflect.Field; imp ...
- postgresql 将同一个字段的值组合和将多个字段的值组合
多字段值根据连接符拼接 concat_ws(':',aaa,bbb) 单字段值根据连接符拼接 string_agg(ccc,' \r\n ') 如果要将多个字段的值拼接成一个: string_agg( ...
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...
- C# 字段初始值无法引用非静态字段、方法或属性( 类内部变量初始化)
问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 在类中 变量赋值其他变量报错? public class TestClass{ public TestClass() { } pu ...
- java利用注解及反射做通用的入参校验
一.原理: 1.做一个field注解,注解有两个参数:是否必填.toString之后的最大长度 2.对某个request类(或基类),使用注解标记某个字段的校验详情 3.通用的static方法,利用反 ...
- sql server在一个字段相同值时,另一个字段结果拼接
如下字段红框里的信息都一样的,通过转换实现字段拼接 SELECT formmain_id,(SELECT field0040+';' FROM formson_5489 WHERE formmain_ ...
随机推荐
- AreYouBusy HDU - 3535 (dp)
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- WZK的减肥计划
WZK 的减肥计划(plan.cpp/ plan.in/ plan.out)问题描述:WZK 发现他的体重正迅猛的上升着,对此他感到非常焦虑,想要制定出一套完美的减肥计划. 于是 WZK 翻阅资料,查 ...
- Wannafly挑战赛21 机器人
从前在月球上有一个机器人.月球可以看作一个 n*m 的网格图,每个格子有三种可能:空地,障碍,机器人(有且仅有一个),现在地面指挥中心想让机器人在月球上行走,每次可以发送一个指令,为 U-往上走.D- ...
- Python之code对象与pyc文件(三)
上一节:Python之code对象与pyc文件(二) 向pyc写入字符串 在了解Python如何将字符串写入到pyc文件的机制之前,我们先来了解一下结构体WFILE: marshal.c typede ...
- luogu2153 [SDOI2009]晨跑
要想限制流量,总要想着拆点. #include <iostream> #include <cstring> #include <cstdio> #include & ...
- 在O(1)时间内删除链表结点 【微软面试100题 第六十题】
题目要求: 给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 参考资料:剑指offer第13题. 题目分析: 有几种情况: 1.删除的结点是头结点,且链表不止一个结点: 2.删除的结点是头结 ...
- how can I ues Dataset to shuffle a large whole dataset?
The Dataset.shuffle() implementation is designed for data that could be shuffled in memory; we're co ...
- 阿里云 fatal: Authentication failed 退出码 128
阿里云拉取代码时需要输入的用户名密码 跟我们登录aliyun的时候的账号密码不一样,需要先重置一下的,重置之前要配置好邮箱 https://code.aliyun.com/profile/passwo ...
- iOS学习笔记49-Swift(九)访问控制
一.Swift的访问控制 Swift中的访问控制模型基于模块和源文件这两个概念 模块指的是Framework或App bundle.在Swift中,可以用import关键字引入自己的工程. 源文件指的 ...
- Codeforces 891 C Envy
题目大意 给定一个 $n$ 个点 $m$ 条边的连通的无向图,每条边有一个权值,可能有重边.给出 $q$ 组询问,一组询问给出 $k$ 条边,问是否存在一棵最小生成树包含这 $k$ 条边. 思路 这道 ...