註解實現對象的屬性賦值

在做一些業務時,從前臺獲取的數據用實體接收後,可能需要有字段轉換才能存儲到庫中,或從庫中查找的數據,會做一些轉換或處理再返回給前臺視圖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、人工智能、小程序、大前端等可看菜單,無私奉獻

關於架構師修煉

本號旨在分享一線互聯網各種技術架構解決方案,分佈式以及高併發等相關專題,同時會將作者的學習總結進行整理並分享。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章