利用注解和反射,将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_ ...
随机推荐
- Applied Nonparametric Statistics-lec2
Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/3 The Binomial Distributio ...
- nrf52810学习笔记——二
nrf52810为nordic支持蓝牙 5.0性价比最高的一款芯片,不过这个芯片的rom不得不吐槽下,只有192KB,不知道为什么定了个192,而不是大家所熟悉的256KB,估计价格是个原因吧,15. ...
- UVa 12299 线段树 单点更新 RMQ with Shifts
因为shift操作中的数不多,所以直接用单点更新模拟一下就好了. 太久不写线段树,手好生啊,不是这错一下就是那错一下. PS:输入写的我有点蛋疼,不知道谁有没有更好的写法. #include < ...
- pycharm下搭建django开发环境
在一次偶然的机会中,了解到万精油语言python,发现其流行程度发展迅速,于是也开始学习起来,正题. 1.安装python,查阅一些相关的资料及周边的开发工具,我选择python2(2.7.11),注 ...
- edge浏览器识别ip地址为手机号的解决办法
edge浏览器识别ip地址为手机号的解决办法 今天突然发现类似101.231.70.242的ip地址会在edge浏览器里面识别为可点击的链接,后来看了一下,原因就是被识别为手机号了,因为我发现点击的时 ...
- loj2020 「HNOI2017」礼物
所有的下标从 \(0\) 开始. 考虑枚举 \(C\) (第一个加上负的等于第二个加上其绝对值)和第二个手链的偏移量 \(p\).答案就是 \[\sum_{i=0}^{n-1}(x_i+C-y_{(i ...
- 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)
使用前提 查询表必须有ID字段,且该字段不能重复,建议为自增主键 背景 如果使用ADO.NET进行开发,在查询分页数据的时候一般都是使用分页存储过程来实现的,本文提供一种通用的分页存储过程,只需要传入 ...
- Maven之scope详解
scope的分类 compile(编译范围) 默认就是compile,什么都不配置也就是意味着compile.compile表示被依赖项目需要参与当前项目的编译,当然后续的测试, 运行周期也参与其中, ...
- JSP内置对象的cookie和session实现简单登录界面
创建一个index.jsp页面 <%@ page language="java" contentType="text/html; charset=utf-8&quo ...
- iOS学习笔记46-Swift(六)扩展
一.Swift扩展 扩展就是向一个已有的类.结构体或枚举类型添加新功能,这包括在没有权限获取原始源代码的情况下扩展类型的能力.扩展和 Objective-C中的分类(category)类似,但是它要比 ...