利用注解和反射,将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_ ...
随机推荐
- python3.7 内置函数整理
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 内置函数整理 #abs(x) #返回数字的绝对值. 参数可以是整 ...
- Mysql数据库查询语法详解
数据库的完整查询语法 在平常的工作中经常需要与数据库打交道 , 虽然大多时间都是简单的查询抑或使用框架封装好的ORM的查询方法 , 但是还是要对数据库的完整查询语法做一个加深理解 数据库完整查询语法框 ...
- python基础学习笔记——字符串方法
索引和切片: 索引:取出数组s中第3个元素:x=s[2] 切片:用极少的代码将数组元素按需处理的一种方法.切片最少有1个参数,最多有3个参数,演示如下: 我们假设下面所用的数组声明为array=[2, ...
- python学习-- 默认urls中 Path converter
默认Path converter Django2.0自带的PathConveter包括: str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器. int:匹配0及 ...
- PHP 开启或关闭错误提示
如果不具备修改 php.ini 的权限,可以如下: // 只需在php文件中加入这两句即可开启PHP错误提示 ini_set("display_errors", "On& ...
- 用requests自动访问网页,下载网页内容
import requests # 请求下载excel def downloading(text_path): # 访问要下载的链接文件 with open(text_path) as f: for ...
- Linux问题故障定位
CPU 针对应用程序,通常关注的是内核CPU调度器功能和性能. 线程的状态分析主要是分析线程的时间用在什么地方,而线程状态的分类一般分为: a. on-CPU:执行中,执行中的时间通常又分为用户态时间 ...
- git如何忽略文件或者文件夹
用git开发中会有一些不愿意提交的目录或者文件 在仓库目录下新建一个名为.gitignore的文件(因为是点开头,没有文件名,没办法直接在windows目录下直接创建,必须通过右键Git Bash,按 ...
- 【bzoj3439】Kpm的MC密码 可持久化Trie树
题目描述 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记了密码,只能来解答那些神奇的身份验证问题了. ...
- Swagger Edit自动生成代码工具
一.swagger简介 swagger是一套开源的API设计工具,包括Swagger UI和Swagger Editor等.其中swagger edit是用来编辑接口文档的小程序,非常简单易用.在官网 ...