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,注解,数据字典)