在做一些業務時,從前臺獲取的數據用實體接收後,可能需要有字段轉換才能存儲到庫中,或從庫中查找的數據,會做一些轉換或處理再返回給前臺視圖view。
有一個簡單的BeanUtils.copyProperties(source, target, ignoreProperties);可實現兩個對象之間屬性的轉換,但此種方式僅僅支持完全相同字段名和字段類型的字段賦值;另外有第三方工具dozer,使用dozer工具,這個需要xml配合或需要繼承DozerConverter接口處理,也挺惱人。
對於系統中多處需要字段換值的處理,以下提供一種註解的方式。
項目代碼:https://github.com/alranger/dataconverter
另外SOA代碼:https://github.com/genie-arct/soa
註解:
/**
* 用於字段賦值的處理
* 目前:source與target不共存,先判斷source,有source則不處理target
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConverterField {
/**
* 主要用於處理字段名相同,類型不同的數據
* 字段類型(最直接的類型)
* example:
* 1、 @ConverterField(target = BasicUser.class)
* private List<BasicUser> leaders;
* 2、 @ConverterField(target = BriefVO.class)
* private BriefVO type;
*/
Class<?> target();
/**
* 用於處理數據拼接,獲取對象字段用"." 分割,如entity.name
* 數據來源
* 當註解有source時; target= Target.class 是默認空值
* @return
*/
String[] source() default {};
/**
* 數據的來源對象,目前用於source()數據處理, field的值可以來自於自身的entity
* @return
*/
OriginType origin() default OriginType.OPPOSITE;
}
以下用例子說明:
一、兩個對象中字段名相同,類型不同的用法:
1、字符串轉對象或List
源對象source:
源對象中的兩個字段的,是獲取的數據字典數據dict,修改的頻率不多,但涉及到查詢,沒有用AttributeConverter去處理,而是自己處理成json串存儲爲string
目標對象target:
爲了給前端提供更友好的數據,轉換爲實體的或List<?>,
註解的使用:
這裏沒有轉化爲數據字典(dict),而是使用了一個簡化的entity,只返回最關注的信息,使用了一個簡化的BriefVO。
結果:
2、entity之間的轉換:
源對象source:
目標對象target:
Stage與BriefvO的屬性是完全不同的,
結果:
二、字段的拼接
有時返回的數據僅僅只是其中一個對象的屬性字段值,也可以通過註解的方式來實現:
源source:
目標target:
結果:
三、後面有時間會加上關於數字的計算和日期的計算或處理等,待續
在公衆號 “架構師修煉” 菜單可獲得專屬java架構視頻資料,更多java、python、人工智能、小程序、大前端等可看菜單,無私奉獻
關於架構師修煉
本號旨在分享一線互聯網各種技術架構解決方案,分佈式以及高併發等相關專題,同時會將作者的學習總結進行整理並分享。