在开始之前,首先我们要了解一个类: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实现数据字典翻译相关推荐

  1. Java注解配置rest服务_Spring Boot 注解—常用注解

    注:该部分内容包含一些常用注解,如果没有学习过java注解的同学可以先看一下上一小节的内容Spring Boot 注解-基本知识 ,不看也没关系,下面就开始本节内容. @Configuration注解 ...

  2. Java注解---通俗易懂

    本文转载于Java注解-最通俗易懂的注解 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解. 我个人认为,比较糟糕的技术文 ...

  3. 1.1 Java注解(Annotation)简介

    从 Java 5 版本之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),是 Java 平台中非常重要的一部分.注解都是 @ 符号开头的,例如我们在学习方法重写时使用过的 ...

  4. Java注解原来如此通俗易懂

    目录: 1.注解概述 2.注解的作用分析 3.JDK中预定义的一些注解 4.自定义注解 5.元注解 6.解析注解 1.注解概述 Java注解是一系列元数据,它提供数据用来解释程序代码,它是JDK1.5 ...

  5. java 注解应用技巧_改善Java应用程序性能的快速技巧

    java 注解应用技巧 曾经遇到过性能问题吗? 我也是. 如果我的经理再喊一次" faaaaster",我一生都会有听力障碍. 顺便说一句,我能听到所有噪音中的德语发音吗? ;-) ...

  6. java注解_Java注解

    java注解 Java Annotations provides information about the code. Java annotations have no direct effect ...

  7. Java注解(Annotation):请不要小看我!

    在 Java 中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为 RTTI,英文全称为 Run-Time Type Identification,即运行时类 ...

  8. java注解看这一篇就够了

    java注解-最通俗易懂的讲解 转载 Tanyboye 最后发布于2018-06-05 10:24:36 阅读数 27063 收藏 发布于2018-06-05 10:24:36 分类专栏: java ...

  9. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

最新文章

  1. Scrum模拟微信看一看“疫情专区”的敏捷开发过程
  2. python画笑脸-python 学习笔记——学会用turtle画笑脸
  3. 15_多子图-Subplot、Subplot: 使用多个figures和 axes、替代解决方案:
  4. java卡片布局源码_Java编程使用卡片布局管理器示例【基于swing组件】
  5. [WCF]利用net.tcp傳輸協定來建置WCF Service
  6. 论文中常用的几个Word2010技巧
  7. CodeForces - 1288E Messenger Simulator(树状数组)
  8. java bufferarray_Java中的ByteBuffer array()方法
  9. Arcgis 使用ArcToolbox实现数据统计
  10. wp insert post 插入文章到数据库
  11. 演练 模拟银行账户业务
  12. mybatis传入参数类型parameterType详解
  13. win7和xp,哪个才是你的选择?
  14. win10杜比全景声评测_Win10安装杜比全景声音效教程
  15. 微信消息推送渠道建设
  16. 鲁大师2022半年报电脑排行:RTX 3090 Ti继任“卡皇”,顶级笔记本开始拼颜值!
  17. iOS开发常用三方库、插件、知名博客等等
  18. 超全Python图像处理讲解(多图预警)
  19. 今日科技联播:美团今日上市估值超小米京东;阿里巴巴获杭州第一张自动驾驶牌照...
  20. Android面试准备之Java基础

热门文章

  1. Anaconda中快速安装Tensorflow与Keras并在pycharm中完成相应配置(win10cpu版)
  2. QT中使用QCustomplot设置坐标原点在左上或者反转镜像坐标轴
  3. 我的2013-一个dota半职业玩家向码农的转变路
  4. 运满满的技术架构演进之路
  5. QQ会员亿级Web系统的容错性建设实践--转
  6. Linux 2.4调度系统分析--转
  7. 【风控系统】风控中心—京东基于Spark的风控系统架构实践和技术细节
  8. 元宇宙iwemeta:互联网行业年底清算,税收优惠门槛抬高,阿里巴巴多交41亿税款
  9. 编辑docker容器中的文件
  10. 区块链】利用Node.js开发与合约交互的Web界面