java 数据字典 spring_springboot+redis+切面实现数据字典功能

自定义注解:DataDict,用于bo对象类,需要翻译的属性

package com.zddts.common.annotation.dict;

import java.lang.annotation.*;

/**

* 说明:数据字典处理类

* Created by luojie on 2019/05/29.

*/

//@DataDict( dict="patType", source = "patType" )

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface DataDict {

/**

* 方法描述 描述标准编码

* @return

*/

String dict() default "";

/**

* 方法描述,可使用占位符获取参数:{{source}}

* 主要标准编码之来源

*/

String source() default "";

}

自定义注解:

DataDictClass 用来表面返回对象集合需要,本功能目前只支持bean对象的属性翻译

package com.zddts.common.annotation.dict;

import java.lang.annotation.*;

/**

* 说明:

* Created by luojie on 2019/05/29.

*/

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface DataDictClass {

}

切面处理: DataDictAspect

package com.zddts.ac.aop;

import com.alibaba.fastjson.JSON;

import com.zddts.ac.client.PubappClient;

import com.zddts.common.annotation.dict.DataDict;

import com.zddts.common.annotation.dict.DataDictClass;

import com.zddts.common.bo.pubapp.PuCodeBo;

import com.zddts.common.utils.BeanUtils;

import org.apache.commons.lang.StringUtils;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.aspectj.lang.reflect.MethodSignature;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

/**

* 说明:数据字典切面类

* Created by luojie on 2019/05/29.

*/

@Aspect

@Component

public class DataDictAspect {

@Autowired

PubappClient pubappClient;

/**

* 非基本类型在 CLASS 中的定义

*/

private static final String FILED_NAME_TYPE = "TYPE";

private Map dictInfoMap = new ConcurrentHashMap<>();

@Pointcut("@annotation(dataDictClass)")

public void doDataDictClass(DataDictClass dataDictClass) {

}

@Around("@annotation(dataDictClass)")

public Object translation(final ProceedingJoinPoint pjp, DataDictClass dataDictClass) throws Throwable {

Object result = pjp.proceed();

if (result == null) {

return result;

}

Object obj;

if (result instanceof List || result instanceof ArrayList) {

List olist = ((List) result);

if (olist.size() == 0) {

return result;

}

obj = olist.get(0);

} else {

obj = result;

}

List> dictParams = boDict(obj.getClass());

if (dictParams.size() == 0) {

return result;

}

//TODO 后期需优化读取Redis

List dictInfos = pubappClient.getPuCodeByType("patType");

if (dictInfos == null && dictInfos.size() == 0) {

return result;

}

//先把字典值转成map

for (PuCodeBo puCodeBo : dictInfos) {

dictInfoMap.put(puCodeBo.getCodeType() + puCodeBo.getValue(), puCodeBo.getCodeName());

}

if (result instanceof List || result instanceof ArrayList) {

for (Object o : (List) result) {

sign(o, dictParams, dictInfoMap);

}

} else {

sign(result, dictParams, dictInfoMap);

}

return result;

}

/**

* 单个设置值

*

* @param obj

* @param dictParams

* @param dictInfoMap

*/

public void sign(Object obj, List> dictParams, Map dictInfoMap) {

for (Map dictParam : dictParams) {

String dict = dictParam.get("dict");

String source = dictParam.get("source");

String dictName = dictParam.get("dictName");

try {

//获取源编码值

String sourceValue = (String) BeanUtils.getBeanFieldValue(obj.getClass(), obj, source);

String dictCodeName = dictInfoMap.get(dict + sourceValue);

//设置值

BeanUtils.setBeanField(obj.getClass(), obj, dictName, dictCodeName);

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

* 获取bo中属性值

*

* @param cla

* @return

*/

private List> boDict(Class cla) {

Field[] fields = cla.getDeclaredFields();

List> list = new ArrayList>();

Map map;

DataDict dataDict;

for (Field field : fields) {

if (field.isAnnotationPresent(DataDict.class)) {

map = new HashMap();

dataDict = field.getAnnotation(DataDict.class);

map.put("dict", dataDict.dict());

map.put("source", dataDict.source());

map.put("dictName", field.getName());

list.add(map);

}

}

return list;

}

}

使用:

对要数据字典转换的方法加上DataDictClass注解

需要注解翻译的加上注解DataDict ,dict是指标准码的编码

工具类:主要用了反射机制

package com.zddts.common.utils;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.*;

import java.util.Map.Entry;

public class BeanUtils {

/**

* 方法说明:将List转换为List

*

* @param mapList

* @param cls

* @return

* @throws Exception

*/

public static List mapListToBeanList(

List> mapList, Class> cls) throws Exception {

if (mapList == null || mapList.size() == 0) {

return null;

}

List beanList = new ArrayList();

Object bean = null;

for (Map map : mapList) {

bean = mapToBean(map, cls);

if (bean == null) {

continue;

}

beanList.add(bean);

}

return beanList;

}

/**

* 设置bean 属性值,没有下划线的

*

* @param map

* @param cls

* @return

* @throws Exception

*/

public static Object mapToBeanNL(Map map, Class> cls) throws Exception {

if (map == null || map.size() == 0) {

return null;

}

Object obj = cls.newInstance();

for (Entry entry : map.entrySet()) {

String key = entry.getKey();

Object value = entry.getValue();

if (value == null) {

continue;

}

// 判断字段是否存在

String fieldName = key;

Field field = getBeanField(cls, fieldName);

if (field == null) {

continue;

}

// 判断字段的set方法是否存在

String setMethodName = StringUtils.pareSetName(fieldName);

Method method = getBeanMethod(cls, setMethodName, field.getType());

if (method == null) {

continue;

}

String fieldType = field.getType().getSimpleName();

if ("String".equals(fieldType)) {

method.invoke(obj, value.toString());

} else if ("long".equals(fieldType) || "Long".equals(fieldType)) {

method.invoke(obj, Long.valueOf(value.toString()));

} else if ("int".equals(fieldType) || "Integer".equals(fieldType)) {

method.invoke(obj, value.toString());

} else if ("double".equals(fieldType) || "Double".equals(fieldType)) {

method.invoke(obj, Double.valueOf(value.toString()));

} else if ("float".equals(fieldType) || "Float".equals(fieldType)) {

method.invoke(obj, Float.valueOf(value.toString()));

} else if ("boolean".equals(fieldType) || "Boolean".equals(fieldType)) {

if (value.getClass().equals(Boolean.class)) {

method.invoke(obj, (Boolean) value);

} else {

method.invoke(obj, Boolean.valueOf(value.toString()));

}

} else if ("Date".equals(fieldType)) {

if (value != null) {

if (value.getClass().equals(Date.class)) {

method.invoke(obj, (Date) value);

} else {

method.invoke(obj, DateUtils.strToDate(value.toString()));

}

}

}

}

return obj;

}

/**

* 设置bean 属性值

*

* @param map

* @param cls

* @return

* @throws Exception

*/

public static Object mapToBean(Map map, Class> cls)

throws Exception {

if (map == null || map.size() == 0) {

return null;

}

Object obj = cls.newInstance();

for (Entry entry : map.entrySet()) {

String key = entry.getKey();

Object value = entry.getValue();

if (value == null) {

continue;

}

// 判断字段是否存在

String fieldName = StringUtils.toUnderLine(key.toLowerCase());

Field field = getBeanField(cls, fieldName);

if (field == null) {

continue;

}

// 判断字段的set方法是否存在

String setMethodName = StringUtils.pareSetName(fieldName);

Method method = getBeanMethod(cls, setMethodName, field.getType());

if (method == null) {

continue;

}

String fieldType = field.getType().getSimpleName();

if ("String".equals(fieldType)) {

method.invoke(obj, value.toString());

} else if ("long".equals(fieldType) || "Long".equals(fieldType)) {

method.invoke(obj, Long.valueOf(value.toString()));

} else if ("int".equals(fieldType) || "Integer".equals(fieldType)) {

method.invoke(obj, value.toString());

} else if ("double".equals(fieldType) || "Double".equals(fieldType)) {

method.invoke(obj, Double.valueOf(value.toString()));

} else if ("float".equals(fieldType) || "Float".equals(fieldType)) {

method.invoke(obj, Float.valueOf(value.toString()));

} else if ("boolean".equals(fieldType)

|| "Boolean".equals(fieldType)) {

if (value.getClass().equals(Boolean.class)) {

method.invoke(obj, (Boolean) value);

} else {

method.invoke(obj, Boolean.valueOf(value.toString()));

}

} else if ("Date".equals(fieldType)) {

if (value != null) {

if (value.getClass().equals(Date.class)) {

method.invoke(obj, (Date) value);

} else {

method.invoke(obj, DateUtils

.strToDate(value.toString()));

}

}

}

}

return obj;

}

/**

* 方法说明:将List转换为List

*

* @param beanList

* @return

* @throws Exception

*/

public static List> beanListToMapList(

List> beanList) throws Exception {

if (beanList == null || beanList.size() == 0) {

return null;

}

List> mapList = new ArrayList>();

Map map = null;

for (Object bean : beanList) {

map = beanToMap(bean);

if (map == null || map.size() == 0) {

continue;

}

mapList.add(map);

}

return mapList;

}

/**

* 设置bean 属性值

*

* @param bean

* @return

* @throws Exception

*/

public static Map beanToMap(Object bean) throws Exception {

if (bean == null) {

return null;

}

Map map = new HashMap();

Class> cls = bean.getClass();

Field fields[] = cls.getDeclaredFields();

for (Field field : fields) {

String fieldName = field.getName();

String fieldType = field.getType().getSimpleName();

boolean isBooleanType = false;

if (fieldType.equals("boolean") || fieldType.equals("Boolean")) {

isBooleanType = true;

}

String getMethodName = StringUtils.pareGetName(fieldName,

isBooleanType);

// 判断字段的无参get方法是否存在

Method method = getBeanMethod(cls, getMethodName, new Class[]{});

if (method == null) {

continue;

}

Object fieldValue = method.invoke(bean, new Object[]{});

map.put(StringUtils.toUnderLine(field.getName()).toUpperCase(),

fieldValue);

}

return map;

}

/**

* 判断该方法是否存在

*

* @param methods

* @param met

* @return

*/

public static boolean checkMethod(Method methods[], String met) {

if (null != methods) {

for (Method method : methods) {

if (met.equals(method.getName())) {

return true;

}

}

}

return false;

}

/**

* 方法说明:获取bean的指定方法

*

*

* Author: zhenqiangs Create Date: 2016-4-30 下午01:07:12 History: 2016-4-30

* 下午01:07:12 zhenqiangs Created.

*

* @param cls

* @param methodName

* @param paramTypes

* @return

*/

private static Method getBeanMethod(Class> cls, String methodName,

Class>... paramTypes) {

if (cls == null) {

return null;

}

Method setMethod = null;

try {

setMethod = cls.getMethod(methodName, paramTypes);

} catch (Exception e) {

}

return setMethod;

}

/**

* 方法说明:获取bean的指定属性

*

* @param cls

* @param fieldName

* @return

*/

public static Field getBeanField(Class> cls, String fieldName) {

if (cls == null) {

return null;

}

Field field = null;

try {

field = cls.getDeclaredField(fieldName);

} catch (Exception e) {

}

return field;

}

/**

* 设置对应值

*

* @param fieldName

*/

public static void setBeanField(Class> cls, Object obj, String fieldName, Object value) throws Exception {

// 判断字段是否存在

Field field = getBeanField(cls, fieldName);

if (field == null) {

return;

}

// 判断字段的set方法是否存在

String setMethodName = StringUtils.pareSetName(fieldName);

Method method = getBeanMethod(cls, setMethodName, field.getType());

if (method == null) {

return;

}

//为空不设置

if (value == null) {

return;

}

String fieldType = field.getType().getSimpleName();

if ("String".equals(fieldType)) {

method.invoke(obj, value.toString());

} else if ("long".equals(fieldType) || "Long".equals(fieldType)) {

method.invoke(obj, Long.valueOf(value.toString()));

} else if ("int".equals(fieldType) || "Integer".equals(fieldType)) {

method.invoke(obj, value.toString());

} else if ("double".equals(fieldType) || "Double".equals(fieldType)) {

method.invoke(obj, Double.valueOf(value.toString()));

} else if ("float".equals(fieldType) || "Float".equals(fieldType)) {

method.invoke(obj, Float.valueOf(value.toString()));

} else if ("boolean".equals(fieldType) || "Boolean".equals(fieldType)) {

if (value.getClass().equals(Boolean.class)) {

method.invoke(obj, (Boolean) value);

} else {

method.invoke(obj, Boolean.valueOf(value.toString()));

}

} else if ("Date".equals(fieldType)) {

if (value.getClass().equals(Date.class)) {

method.invoke(obj, (Date) value);

} else {

method.invoke(obj, DateUtils.strToDate(value.toString()));

}

}

}

/**

* 设置对应值

*

* @param fieldName

*/

public static Object getBeanFieldValue(Class> cls, Object obj, String fieldName) throws Exception {

// 判断字段是否存在

Field field = getBeanField(cls, fieldName);

// 判断字段的set方法是否存在

String getMethodName = StringUtils.pareGetName(fieldName, false);

// 判断字段的无参get方法是否存在

Method method = getBeanMethod(cls, getMethodName, new Class[]{});

Object fieldValue = method.invoke(obj, new Object[]{});

return fieldValue;

}

}

source 指bean中翻译所需要对应的值字段

---------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java支持多线程吗_Java多线程之一

进程与线程进程进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位&#xff0c;比如我们windows电脑上运行的一个程序就是一个进程。在传统进程中进程是资源分配和调度的一个基本单位&#xff0c;在后来引入线程概念后&#xff0c;进程就变成了资源分…

java继承与多态性_Java继承与多态浅析

一、继承1、通过extends继承的父类可以是不加abstract关键字的普通类&#xff0c;也可以是加了abstract关键字的抽象类。继承普通类时可以覆写父类的方法&#xff0c;或者创建自己独有的方法&#xff0c;或者这两 者都不使用。继承抽象类时&#xff0c;必须覆写抽象类中的…

java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

前言为什么需要去了解AQS&#xff0c;AQS&#xff0c;AbstractQueuedSynchronizer&#xff0c;即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)&#xff0c;JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步…

java resttemplate_java-通过resttemplate通过Spring Rest服务发送文...

标题可能看起来很普通,但是没有一个适合我的问题.我有一个REST服务,它接受多部分形式的常规参数和文件.我想使用resttemplate将数据和文件发送到上述rest服务.直到我发送正常的字符串数据为止,没有任何问题.一旦我添加了发送字节的代码,那么我开始收到400错误的请求错误.如果我…

java中string的方法_java中String的常用方法

package com.string;public class string1 {public static void main(String args[]){//将char[]数组转换成Stringchar[] ch{h,我,是,中,国,人};String strnew String(ch);System.out.println(str); //结果为str"我是中国人"//将字符串转换为char数组,方法一使用getC…

Java是否为回文_java语言判断一个数字是否为回文数字

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为…

java floyd_百度百科里面的floyd算法java的代码,总是无法运行。请问是代码有问题吗,如何编译啊?...

展开全部不能编译运行的说法是错误&#xff0c;但是结果是否正确&#xff0c;我就32313133353236313431303231363533e59b9ee7ad9431333335303539不知道了&#xff0c;我不懂这个算法public class FLOYD {int[][] length null;// 任意两点之间路径长度int[][][] path null;// …

cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

原标题&#xff1a;并发环境下&#xff0c;先操作数据库还是先操作缓存&#xff1f;来源&#xff1a;捡田螺的小男孩前言在分布式系统中&#xff0c;缓存和数据库同时存在时&#xff0c;如果有写操作&#xff0c;先操作数据库还是先操作缓存呢&#xff1f;本文将分5种方案 展开…

contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常

原因&#xff1a; crontab 没有去读环境变量&#xff0c;需要再脚本中手动引入环境变量&#xff0c;可以用source 也可以用export 写死环境变量。为了定时监控Linux系统CPU、内存、负载的使用情况&#xff0c;写了个Shell脚本&#xff0c;当达到一定值得时候&#xff0c;发送邮…

java的mybatis批量更新_mybatis批量更新的问题

一、问题描述场景描述&#xff1a;有这样一个service方法&#xff0c;调用了两个dao中的方法。第一个方法按照传入的id批量更新用户名。第二个dao方法无数据库操作&#xff0c;仅仅抛出一个RuntimeException.这个service方法通过xml配置由spring事务管理的。两个DAO类中分别有S…

java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器

一、方法一打印虚拟机所有参数[rootlocalhost ~]# java -XX:PrintFlagsFinal -version | grep :uintx InitialHeapSize : 258689024 {product}uintx MaxHeapSize : 4139778048 {product}bool PrintFlagsFinal : true {product}bool UseCompressedOops : true {lp64_product}boo…

java在W n8安装_在windows中安装JDK8并配置环境变量-java环境变量设置

学习JAVA&#xff0c;必须得安装一下JDK(Java development kit java开发工具包)&#xff0c;配置一下环境就可以学习JAVA了&#xff0c;下面是下载和安装JDK的教程&#xff1a;一、去oracle官网上下载jdk8的下载地址&#xff1a;https://www.oracle.com/technetwork/java/javas…

lisp java_从Java调用的LISP代码

长篇小说:我正在为我的函数编程类做一个项目,我想到在Lisp中为Mario AI competition.我正在研究从Java调用LISP代码的框架/库/方式,甚至更好的LISP Java互通信。我看过Jacol但它是旧的,对我来说也不是很好。到目前为止,我的最佳选择是:Jatha.它真的很整洁,虽然一些Lisp构造还没…

java将图片上传数据库_〔技巧实例〕轻松实现将上传图片到数据库

很久就想自己写一写程序了&#xff0c;不过由于赖就不想写我&#xff0c;今天刚好有空&#xff0c;所以写了这个小小的程序很容易一看就知道的&#xff0c;不多说了就此开始&#xff1a;我们做一个上传的。数据据库的字段就id自动编号 big 字段类型是 OLE 呵呵就简单的那个字段…

mysql带参数的sql_MySql存储过程是带参数的存储过程(动态执行SQL语句)

下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句)&#xff0c;该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息&#xff0c;排序条件可以没有调用方式&#xff1a;call GetUsersDynamic(age<30,);/********动态查询用户的信息********/CREATE PRO…

java 注释 depredated_depredated是什么意思_depredated怎么读_depredated翻译_用法_发音_词组_同反义词-新东方在线英语词典...

双语例句1.Theentireareahasbeendepredatedinthewar.整个地区在战争中都遭到破坏。2.WehopethatHaitiwhich washeavilydepredatedby the killerquakewillbereconstructedintheforseeablefuture.我们希望在大地震中受重创的海地在不久的将来可以重建。3.TwoIssuesonAddresseesDe…

java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园

1、设计思想雷达扫描图&#xff0c;在影视作品中见到较多&#xff0c;比如飞机雷达、舰艇雷达&#xff0c;有一个扫描线转圈代表雷达一周旋转或一个批次的收发&#xff0c;发现目标就在表盘上标记位置。和汽车仪表盘类似&#xff0c;汽车仪表盘有底盘背景图、同圆、刻度、刻度值…

mysql降序后去重_Mysql 数据记录去重后按字段排序

实现效果&#xff1a;去重—取最新的—排序例子 : 按用户ID获取历史记录中某个人的记录&#xff0c;要求非重复的且每条只获取最新的&#xff0c;同时按添加时间倒序排列的实现 &#xff1a;SELECT *FROM (SELECT *FROM historysWHERE types_id1ORDER BY created DESC) AS BGRO…

linux php 守护进程,PHP程序员玩转Linux系列 使用supervisor实现守护进程

PHP程序员玩转Linux系列文章&#xff1a;首先遇到的问题是,部署nodejs的博客程序时,我把执行nodejs的命令放到后台,使用加&和nohup命令如:nodejs index.js & 或者 nohup nodejs index.js &&这个使用是当退出此次终端会话的时候就会停止, nohup这个命令理论上是…

计算机初级包括php吗,计算机的基本组成包括什么

计算机的基本组成包括控制器、运算器、存储器、输入设备和输出设备。其中&#xff0c;控制器是整个计算机的中枢神经&#xff0c;它的功能是对程序规定的控制信息进行解释&#xff0c;根据其要求进行控制&#xff0c;调度程序、数据&#xff0c;协调计算机各部分工作及内存与外…