javascript
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_计蒜客 无脑博
- 下一篇: java 0000 0001 0002