文档章节

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

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

@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
成都
Java Server Faces (JSF) 页面转换与验证(一)

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

码上中国博客
2015/02/03
0
0
词嵌入向量WordEmbedding的原理和生成方法

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

JackMeGo
2017/12/15
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

没有更多内容

加载失败,请刷新页面

加载更多

Bash常用内置变量介绍

Bash常用内置变量介绍 Bash中有很多内置变量,这些变量不仅影响Bash的相关行为,也大大的方便了用户的常见操作。**Bash内置变量大体上包括两类,一类是传统Shell所具备的,另一类就是Bash所特...

小陶小陶
27分钟前
0
0
05-《深度拆解Java虚拟机》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
47分钟前
3
0
nginx统一入口 多服务出口

nginx配置多ip和端口统一调用入口log_format中$upstream_addr 标识打印转发的url地址配置upstream和locationhttp {include mime.types;default_type application/octet-stream...

GoldenVein
48分钟前
3
0
阿里P9架构师谈:高并发网站的监控系统选型、比较、核心监控指标

在高并发分布式环境下,对于访问量大的业务、接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况...

我是你大哥
50分钟前
2
0
华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!

还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线...

华为终端开放实验室
52分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部