文档章节

如何利用AOP将对象数据字典字段code转换name输出前端展示

随风所欲
 随风所欲
发布于 2015/12/25 15:01
字数 947
阅读 122
收藏 3
点赞 0
评论 0
  • 首先编写自定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dict {
	String value() default "";
}

  • 然后将注解绑在需要转换的对象字段上并指明该字段所属码表的父级code

@Dict("008")
private String countStatus;

  • 接着编写aop类设定查询方法的切入点

@Aspect
@Configuration
public class DataDictionaryHandleAOP {
	@Autowired
	//数据字典处理工具类
	private DataDictionaryUtil dataDictionaryUtil;
	//设定切入点
	@Pointcut("execution(* com.bjhy.platform.sw.*.service.impl.*.findByPage(..)) || execution(* com.bjhy.platform.sw.*.service.impl.*.findByPage_*(..))")
	private void anyMethod(){};
	
	//切入方式为后切入
	@AfterReturning("anyMethod() && args(pageInfo)")
	public void doAfter(PageInfo<?> pageInfo){
		System.out.println("AOP数组字典code转name--start "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		int count = 0;
		//获取数据集
		List<?> list = pageInfo.getPage().getContent();
		if(list!=null&&list.size()>0){
			long startD = new Date().getTime();
			//初始中央平台获取class转换所需的码表集合
			dataDictionaryUtil.initData(list.get(0).getClass());
			//开始转换
			dataDictionaryUtil.handDictionaryCodeToCodeName(list);
			count  = (int) (new Date().getTime() - startD);
		}
		System.out.println("AOP数组字典code转name--end"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		System.out.println("耗时:"+count+" ms");
	}
	
}

  • 最后通过反射编写转换代码,特别处理部分@OneToOne链表对象

@Component
public class DataDictionaryUtil {
	@Reference
	private SystemCodeService systemCodeService;//cas系统获取数据字典服务
	@Reference
	private OrganizationService organizationService;//cas系统获取组织机构服务
	//数据字典
	private static List<SystemCode> dictList = new ArrayList<SystemCode>();
	//组织机构字典
	private static List<OrganizationInfo> orgList = new ArrayList<OrganizationInfo>();
	//需要转化的字段名
	private static String fieldNames = "";
	//已经获取的数据字典记录,避免重复去cas系统获取
	private static Map<String, String> codeRecord = new HashMap<String, String>();
	
	/**
	 * 根据clzz初始将要转化的字典数据
	 * @param clzz 需要转换的对象class
	 */
	public <T> void initData(Class<T> clzz){
		clear();
		initDictionary(clzz);
	}
	
	public void clear(){
		fieldNames = "";
	}
	
	public <T> void initDictionary(Class<T> clzz){
		Field[] fields = clzz.getDeclaredFields();
		for (Field field : fields) {
			Class c = field.getType();
			//判断字段否是对象
			if(null!=c.getClassLoader()){
				//递归获取需要转换的字段
				initDictionary(c);
			}else{
				if(field.isAnnotationPresent(Dict.class)){
					fieldNames += clzz.getSimpleName()+"."+field.getName()+",";
					Dict dict = field.getAnnotation(Dict.class);
					//判断是否已经获取过该code的字典数据 避免重复获取
					if(codeRecord.get(dict.value()) == null){
						List<SystemCode> list = systemCodeService.getChildrenByCode(dict.value());
						if(list!=null&&list.size()>0){
							dictList.addAll(list); 
							//记录已经获取的字典code
							codeRecord.put(dict.value(), dict.value());
						}
					}
				}else if(field.isAnnotationPresent(Org.class)){
					fieldNames += clzz.getSimpleName()+"."+field.getName()+",";
					Org org = field.getAnnotation(Org.class);
					if(codeRecord.get(org.value()) == null){
						List<OrganizationInfo> list = organizationService.getChildrenByType(org.value());
						if(list!=null&&list.size()>0){
							orgList.addAll(list);
							codeRecord.put(org.value(), org.value());
						}
					}
				}
			}
		}
	}
	/**
	 * 将指定数据内凡是对象标注有@dict @org 注解的字段转化为对应数据字典的codeName)
	 * @param datalist 数据集合(一般为分页查询后的pageInfo.getPage().getContent()数据)
	 * @return 返回List<Object> 
	 */
	public <T> List<Object> handDictionaryCodeToCodeName(List<?> datalist){
		System.out.println("需要转换的字段为:"+fieldNames);
		if(StringUtils.isNotEmpty(fieldNames)){
			String[] fNames = fieldNames.split(",");
			for (Object object : datalist) {
				codeToName(fNames, object);
			}
		}
		return (List<Object>) datalist;
	}
	
	public void codeToName(String[] fNames,Object object){
		String classFieldName = "";
		Class clzz = object.getClass();
		Field[] fields = clzz.getDeclaredFields();
		for (int i = 0; i < fNames.length; i++) {
			for (Field field : fields) {
				Class c = field.getType();
				//是否是对象
				if(null!=c.getClassLoader()){
					//只统计一次
					if(i==0){
						classFieldName += field.getName()+",";
					}
				}else{
					String[] n = fNames[i].split("\\.");
					if(clzz.getSimpleName().equals(n[0])&&field.getName().equals(n[1])){
//						System.out.println("开始转换字段:"+fNames[i]);
						try {
							field.setAccessible(true);
							String val = (String) field.get(object);
							if(field.isAnnotationPresent(Dict.class)){
								for (SystemCode code : dictList) {
									if(code.getCode().equals(val)){
										field.set(object, code.getCodeName());
										break;
									}
								}
							}else if(field.isAnnotationPresent(Org.class)){
								for (OrganizationInfo org : orgList) {
									if(org.getOrgCode().equals(val)){
										field.set(object, org.getOrgName());
										break;
									}
								}
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
						break;
					}
				}
			}
		}
		String[] classFieldNames = classFieldName.split(",");
		for (String fieldName : classFieldNames) {
			try {
				if(StringUtils.isNotEmpty(fieldName)){
					Field classField = clzz.getDeclaredField(fieldName);
					classField.setAccessible(true);
					if(null!=classField.get(object)){
						codeToName(fNames, classField.get(object));
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		
	}

}


© 著作权归作者所有

共有 人打赏支持
随风所欲
粉丝 2
博文 9
码字总数 7237
作品 0
成都
词嵌入向量WordEmbedding的原理和生成方法

WordEmbedding 词嵌入向量(WordEmbedding)是NLP里面一个重要的概念,我们可以利用WordEmbedding将一个单词转换成固定长度的向量表示,从而便于进行数学处理。本文将介绍WordEmbedding的使用方...

JackMeGo
2017/12/15
0
0
Java Server Faces (JSF) 页面转换与验证(一)

由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统、详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还...

码上中国博客
2015/02/03
0
0
Django之ModelForm验证

一、简介 Django中Model负责操作数据库,并且具有简单的数据库验证功能(基本不用);Form用于用户请求的验证,具有强悍的数据库验证功能;ModelForm是将二者合二为一,即可用于数据库操作(...

daibaiyang119
2017/10/31
0
0
iOS开发·runtime+KVC实现多层字典模型转换(多层数据:模型嵌套模型,模型嵌套数组,数组嵌套模型)

本文实验Demo传送门:DictToModelDemo 前言:将后台JSON数据中的字典转成本地的模型,我们一般选用部分优秀的第三方框架,如SBJSON、JSONKit、MJExtension、YYModel等。但是,一些简单的数据...

陈满iOS
05/08
0
0
input搜索下拉提示框,支持拼音检索、过滤、级联、自定义数据源的ajax异步下拉展示

为解决大数据量下拉字典效率及操作问题,整理出通用的数据字典模块,所有字典数据可在数据库维护,在大数据量时采用分页下拉的展示方式,同时支持拼音简拼搜索,代码项、代码值搜索等,支持无...

神话无名
06/07
0
0
【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类

背景 即使到今天,iOS 应用的内存泄露检测,仍然是一个很重要的主题。我在一年前,项目中随手写过一个简单的工具类,当时的确解决了大问题。视图和控制器相关的内存泄露,几乎都不存在了。后...

ios122
2017/11/23
0
0
淘宝Tprofiler工具实现分析

项目首页:https://github.com/alibaba/TProfiler 工具介绍 TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对...

伍咖
2015/11/14
0
0
使用fastjson的filter机制将String属性转成复杂类型

今天遇到一个很棘手的问题,由于前期设计的失误,导致了数据库中的一个字段不得不用json存储一个非常复杂的对象,前端获取到复杂对象后利用json序列化成jsonstring后存到db中的字段 获取数据...

王小明123
01/23
0
0
MySQL · 最佳实践 · 如何索引JSON字段

概述 MySQL从5.7.8起开始支持JSON字段,这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少没有直接对其字段进行索引的方法。...

阿里云云栖社区
2017/12/22
0
0
open-JWeb(RAD)快速开发平台介绍

Open-JWeb(Java Web)快速开发平台用户操作手册 王保政 Msn:baozhengw999@hotmail.com QQ:29803446 声明:从即日 ,原名为CZTZ-JavaEE快速开发平台更名为Open-JWeb (RAD)快速开发平台,本平台...

迷途d书童
2012/03/09
527
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux 技巧:让进程在后台可靠运行的几种方法

WeiboGoogle+用电子邮件发送本页面 12 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命...

mskk
4分钟前
0
0
手把手教你利用Nextcloud搭建个人网盘/私有云盘

越来越多的云盘宣布关闭,百度网盘也时不时8秒和谐视频,分享也会提示侵权被和谐。为了解决这些问题,我们可以搭建一个自己的个人网盘(私有云盘),常用的开源框架包括ownCloud,Seafile,N...

flyzy2005
8分钟前
0
0
Confluence 6 配置时间和日期格式

你可以修改你 Confluence 为用户显示的时期和时间格式。设置的句法使用的是 SimpleDateFormat class,请参考 Java SimpleDateFormat 文档中的内容来设置日期和时间格式。 有下面 3 个时间和日...

honeymose
11分钟前
0
0
php seralize unserialize

关于PHP 序列化(serialize)和反序列化(unserialize)出现错误(Error at offset)的解决办法。 首先我们分析一下为什么会出现这个错误: 编码问题 UTF-8: ANSI: 我发现在我的机器上边编码改...

yeahlife
18分钟前
0
0
七、JSP九大内置对象和四个作用域

九大内置对象: request:类型是HttpServletRequest,和Servlet里的HttpServletRequest一模一样。 response:类型是HttpServletResponse,和Servlet里的HttpServletResponse一模一样。JSP里基...

Wakeeee_
21分钟前
0
0
第十四章NFS服务搭建与配置

14.1 NFS介绍 NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netap...

Linux学习笔记
53分钟前
0
0
双向认证-nginx

1、设置容器 docker run -it --name nginx-test2 -v /home/nginx:/apps -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 8183:80 -p 7443:443 -d nginx:stable 2、修改nginx配......

hotsmile
54分钟前
0
0
深入了解 Java 自动内存管理机制及性能优化

一图带你看完本文 一、运行时数据区域 首先来看看Java虚拟机所管理的内存包括哪些区域,就像我们要了解一个房子,我们得先知道这个房子大体构造。根据《Java虚拟机规范(Java SE 7 版)》的规...

Java大蜗牛
55分钟前
4
0
SpringBoot | 第六章:常用注解介绍及简单使用

前言 之前几个章节,大部分都是算介绍springboot的一些外围配置,比如日志 配置等。这章节开始,开始总结一些关于springboot的综合开发的知识点。由于SpringBoot本身是基于Spring和SpringMvc...

oKong
56分钟前
12
0
云数据库架构演进与实践

如今,大型企业如金融企业和银行等,在下一代的微服务架构转型要求下,需要基础软件和数据平台能够实现原生的云化,以满足微服务架构的需求。 微服务,也就是一种面向服务的,有特定边界的松...

巨杉数据库
57分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部