利用注解和反射,将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_ ...
随机推荐
- 汇编语言 Part 1——简介、基本语法、内存分段与内存地址
简介 什么是汇编语言? 汇编语言是一种低级的编程语言,在程序的语句和体系结构的机器代码指令之间有很强的对应关系. 每种汇编语言都特定于特定的计算机体系结构,但需要解释或编译.汇编语言也可以称为符号机器 ...
- LeetCode(274)H-Index
题目 Given an array of citations (each citation is a non-negative integer) of a researcher, write a fu ...
- delphi xe7 多线程调用CMD,使用管道,临界区技术,实现指定用户名,多线程,异步返回CMD命令结果到memo
第一次发这个,发现格式很乱,不好看,可以用XE7的project--format project sources命令格式化一下代码. 后面我会上传此次修改函数用的源代码到云盘 链接: http://p ...
- 浅谈Http长连接和Keep-Alive以及Tcp的Keepalive
原文:https://blog.csdn.net/weixin_37672169/article/details/80283935 Keep-Alive模式: 我们知道Http协议采用“请求-应答”模 ...
- Oracle 表空间的日常维护与管理
目录 Oracle 表空间的日常维护与管理 1.创建数据表空间 2.创建临时表空间 3.创建 UNDO 表空间 4.表空间的扩展与修改大小 5.表空间重命名 6.表空间的删除 7.更改表空间的读写模式 ...
- [转]mysql Access denied for user 'root'@'localhost' 问题的解决方法
解决方案如下: # /etc/init.d/mysql stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking &a ...
- 微信小程序开发 -- 设置屏幕亮度
wx.setScreenBrightness(OBJECT) 设置屏幕亮度. OBJECT参数说明: 参数 类型 必填 说明 value Number 是 屏幕亮度值,范围 0~1,0 最暗,1 最亮 ...
- P1988 最大数
最大数 08年江苏的一道省选题. 题目描述: 用两种操作维护一个数列: 1. 查询:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 2. 插入:将n加上t,其中t是最近一次查询操作的答案(如 ...
- python操redis
Python操作redis python连接方式:点击 下面介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redi ...
- iOS-----openGL--openGL ES iOS 入门篇2--->绘制一个多边形
在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...