通过自定义注解、反射和Spring AOP实现字典查询

在一次开发过程中,我发现后端程的工作其实很快就能完成,而前端的进度几乎就决定了开发的进度。所以,我就觉得后端的开发人员在返回数据的时候尽量让前端拿到数据可以直接使用,而不要让前端再转一次。而字典数据就是典型的例子,比如合同的状态在签订中、执行中、执行完成、已废止,员工的职位是普通员工、部门经理、总经理等等,这些数据在数据库中储存的是数字,但是在页面显示的时候需要转成汉字。

后端人员想要将这些数据转成数字其实也很简单,比如重写实体类的setter方法,在set相应的属性的时候就直接进行判断然后转成我们想要的数据就行了,但如果系统大一点的话就不太好管理了,比如员工的职位想要增加一个,但是有多个视图用到了员工职位,那么改的setter方法的时候就需要改多个类。而且如果遇到既需要原本的数据,又需要转换后的数据的情况就很难处理,种种不便我就不再赘述了,这里介绍一个通过自定义注解、反射和Spring AOP实现字典查询的方法来解决这一问题。

首先看看效果:

Student实体类

student实体类中在teacherId、sex和type属性上加了一个@Dict注解。

StudentController

在getStudent和StudentById上加了@QueryDict注解。

请求getStudent方法后得到的结果

可以看到,我们并没用重写任何一个setter方法,但是在最终的请求结果中我们却可以看到多了sex_dictText,type_dictText,teacherId_dicText这三个数据,而且这三个数据看起来就像是原本实体类里面的属性一样。下面就来讲讲如何实现这样的效果。

首先看一下自定义注解:

@Dict注解

dicText和dictTable有默认值,使用的时候可以不传,但传与不传会让dicCode这个属性的作用不同,这个后面再说。

@QueryDict注解

这个注解没有属性,它只是作为一个进行字典查询的标识。

接下来就是使用Spring AOP和反射来进行实现了:

第一步,定义切点

定义切点这里就用到了第二个注解@QueryDict,当使用了@QueryDict这个注解之后,就会进入这个切面。可以看到这里是将目标方法的返回值进行了更改。

下面就来看看是如何更改的:

将result分成了两类进行处理

要进行字典查询的情况只有两种,一种就是进行分页查询的时候,一种就是查询具体哪条数据的时候。用过instanceof来判断是否是IPage类型就可以判断出是否是分页查询了(因为这里是通过mybatis-plus实现查询的),如果是分页查询,那么就有进行迭代,然后再调用eachField来进行下一步判断和更改操作。

不过这里需要先插入一段我的Result类:

Result返回结果类

只需要看它的属性就够了。然后就是eachField方法

eachField方法

这个方法其实就是重新定义了一个json,然后将原先的result返回数据直接添加进去,然后再获取返回数据的每个属性,如果这个属性添加了@Dict注解,就使用translateDicValue来进行字典翻译(可以通过查询数据库来实现,也可以进行通过查询枚举来实现。),然后将翻译后的数据添加进前面定义的json就可以了。上面代码中,oConverUtils.getAllFileds是获取返回数据的所有属性,里面的具体实现是通过getDeclaredFields方法实现的。field.getName()+CommonConstant.DICT_TEXT_SUFFIX是为了给翻译后的数据定义一个键名,就是前面测试结果看到的xxx_dictText。

translateDictValue翻译字典方法

这里调用了dictService.QueryDict方法:

QueryDict方法

可以看到,dictTable和dictText为空字符串和不为空字符串的时候调用的sql是不一样的,不为空字符串的时候就代表着要去其他基本表查。

比如teacherId这个属性添加了@Dict(dictTable =”teacher”,dicText =”teacher.teacher_name”,dicCode =”id”)就表示要去teacher表查teacher_name这个字段,查询条件是teacherId属性的值等于teacher表中的id。

如果dictText为空字符串的话就要去专门的字典表中查。

最后来看一下sql语句

字典查询的sql语句

这样通过自定义注解、反射和Spring AOP实现字典查询的方法就差不多交代清楚了。

作者:雨簦
链接:http://events.jianshu.io/p/28804e9aa04e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:
根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!
1、本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!
2、下载用户仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担
3、站内资源均来源于网络公开发表文件或网友投稿发布,如侵犯您的权益,请联系管理员处理。
4、本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
5、所有资源均收集于互联网仅供学习、参考和研究,请理解这个概念,所以不能保证每个细节都符合你的需求,也可能存在未知的BUG与瑕疵,因本站资源均为可复制品,所以不支持任何理由的退款兑现,请熟知后再支付下载!。
Q码基地 » 通过自定义注解、反射和Spring AOP实现字典查询

发表评论

只做精品资源

立即查看 了解详情