java 注解 数据字典_Spring实现数据字典翻译
在开始之前,首先我们要了解一个类:BeanPropertyWriter。
这个类是由SerializerFactory 工厂进行实例化的,其作用是对bean中的每个字段进行jackson操作的封装,其中封装了字段的一些元信息,和对此字段进行jackson序列化的操作。
采用Spring项目进行Web服务开发时,在获取到数据后,Spring会通过BeanPropertyWriter对数据进行jackson封装,将其转换为Json串。
如果我们需要在不影响逻辑的情况下对数据进行字典翻译,重写此类是较好的选择
字典翻译实现步骤:
1.实现获取字典的接口
public interface DictService{
/**
*key:字典类别
*value:字典代码值
*return:字典代码对应的value值
Object getValueByKey(String key,String value);
}
2.新建注解便于对需要转换的字段进行区分
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
public @interface DictConverter{
String key() default "";
}
3.在需要翻译的字段上添加该注解
@DictConverter(key="TEST)//数据字典中配有字典项为TEST的字典值
private String item;
4.新建SpringUtil类
@Component
public class SpringUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext=null;
@Override
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException{
if(this.applicationContext=null){
this.applicationContext=applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext(){return applicationContext;}
//通过name获取Bean
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通过class获取Bean
public static T Object getBean(Class clazz){
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static T Object getBean(String name,Class clazz){
return getApplicationContext().getBean(name,clazz);
}
}
5.重写BeanPropertyWriter类(主要实现部分)
粘出BeanPropertyWriter的包名,在自己的工程下创建这个包
新建BeanPropertyWriter类,将jackson的源代码copy过来
声明刚才创建的DictService及注解
创建getDictService()用于获取service对象
找到serializeAsField方法
private DictService dictService;
private DictConverter dictConverter;
private DictService getDictService(){
if(dictService==null){
dictService=SpringUtil.getBean(DictService.class);
}
return dictService;
}
public void serializeAsField(Object bean, JsonGenerator gen, SerializerProvider prov) throws Exception {
Object value = this._accessorMethod == null ? this._field.get(bean) : this._accessorMethod.invoke(bean);
//数据字典翻译
try{
if(this._member.hasAnnotation(DictConverter.class)){
dictConverter=this._member.getAnnotation(DictConverter.class);
if(dictConverter!=null){
value=getDictService.getValueByKey(dictConverter.key(),value.toString());
if(value==null){
value = this._accessorMethod == null ? this._field.get(bean) : this._accessorMethod.invoke(bean);
}
}
}
}catch(Exception e){
//此处可能因字段类型出现报错
value = this._accessorMethod == null ? this._field.get(bean) : this._accessorMethod.invoke(bean);
}
//以下部分不做修改,此处省略
}
* 为提高字典转换速度,建议将DictService进行优化,将字典值存入缓存等,以提高页面响应
java 注解 数据字典_Spring实现数据字典翻译相关推荐
- Java注解配置rest服务_Spring Boot 注解—常用注解
注:该部分内容包含一些常用注解,如果没有学习过java注解的同学可以先看一下上一小节的内容Spring Boot 注解-基本知识 ,不看也没关系,下面就开始本节内容. @Configuration注解 ...
- Java注解---通俗易懂
本文转载于Java注解-最通俗易懂的注解 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解. 我个人认为,比较糟糕的技术文 ...
- 1.1 Java注解(Annotation)简介
从 Java 5 版本之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),是 Java 平台中非常重要的一部分.注解都是 @ 符号开头的,例如我们在学习方法重写时使用过的 ...
- Java注解原来如此通俗易懂
目录: 1.注解概述 2.注解的作用分析 3.JDK中预定义的一些注解 4.自定义注解 5.元注解 6.解析注解 1.注解概述 Java注解是一系列元数据,它提供数据用来解释程序代码,它是JDK1.5 ...
- java 注解应用技巧_改善Java应用程序性能的快速技巧
java 注解应用技巧 曾经遇到过性能问题吗? 我也是. 如果我的经理再喊一次" faaaaster",我一生都会有听力障碍. 顺便说一句,我能听到所有噪音中的德语发音吗? ;-) ...
- java注解_Java注解
java注解 Java Annotations provides information about the code. Java annotations have no direct effect ...
- Java注解(Annotation):请不要小看我!
在 Java 中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为 RTTI,英文全称为 Run-Time Type Identification,即运行时类 ...
- java注解看这一篇就够了
java注解-最通俗易懂的讲解 转载 Tanyboye 最后发布于2018-06-05 10:24:36 阅读数 27063 收藏 发布于2018-06-05 10:24:36 分类专栏: java ...
- 夯实Java基础系列15:Java注解简介和最佳实践
Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...
最新文章
- Scrum模拟微信看一看“疫情专区”的敏捷开发过程
- python画笑脸-python 学习笔记——学会用turtle画笑脸
- 15_多子图-Subplot、Subplot: 使用多个figures和 axes、替代解决方案:
- java卡片布局源码_Java编程使用卡片布局管理器示例【基于swing组件】
- [WCF]利用net.tcp傳輸協定來建置WCF Service
- 论文中常用的几个Word2010技巧
- CodeForces - 1288E Messenger Simulator(树状数组)
- java bufferarray_Java中的ByteBuffer array()方法
- Arcgis 使用ArcToolbox实现数据统计
- wp insert post 插入文章到数据库
- 演练 模拟银行账户业务
- mybatis传入参数类型parameterType详解
- win7和xp,哪个才是你的选择?
- win10杜比全景声评测_Win10安装杜比全景声音效教程
- 微信消息推送渠道建设
- 鲁大师2022半年报电脑排行:RTX 3090 Ti继任“卡皇”,顶级笔记本开始拼颜值!
- iOS开发常用三方库、插件、知名博客等等
- 超全Python图像处理讲解(多图预警)
- 今日科技联播:美团今日上市估值超小米京东;阿里巴巴获杭州第一张自动驾驶牌照...
- Android面试准备之Java基础
热门文章
- Anaconda中快速安装Tensorflow与Keras并在pycharm中完成相应配置(win10cpu版)
- QT中使用QCustomplot设置坐标原点在左上或者反转镜像坐标轴
- 我的2013-一个dota半职业玩家向码农的转变路
- 运满满的技术架构演进之路
- QQ会员亿级Web系统的容错性建设实践--转
- Linux 2.4调度系统分析--转
- 【风控系统】风控中心—京东基于Spark的风控系统架构实践和技术细节
- 元宇宙iwemeta:互联网行业年底清算,税收优惠门槛抬高,阿里巴巴多交41亿税款
- 编辑docker容器中的文件
- 区块链】利用Node.js开发与合约交互的Web界面