簡體   English   中英

Orika 在運行時可選的轉換/映射

[英]Orika optional conversion/mapping in runtime

我正在使用 Orika 映射器來避免樣板轉換器,並且有一個有趣的問題。 為了簡化開發,我需要創建一個 Annotation 來確定何時映射值以及何時保持原樣(不是 null 或默認值,原樣)。

想象一下,我們有 2 個類:

class Dto {
    public int id;
    public String name;
}

class Entity {
    public int id;
    public String name;
}

Dto 來自 Front-end,我們希望將字段名稱映射到實體,僅當它以以下內容開頭時:

if {dto.name.startsWith("A")}
    entity.name = dto.name;

而且我們在很多類中都需要類似的邏輯——只更改了起始字符串。

所以我想創建注釋@IfStartsWith(String startsWith)並執行以下操作:

class Entity{
    public int id;
    @IfStartsWith("A")
    public String name;
}

在項目啟動時,我想配置 Orika 映射器從所需的類中讀取此注釋,並根據此設置動態映射行為。

這里重要的是我不能使用默認值(空或空字符串),因為如果檢查失敗,我需要保持目標值不變。 “按原樣”表示現有目標對象中的值或類默認值(設置為public String name = "My name";

我知道如何從字段中獲取注釋並且它現在可以工作,但問題是:

我應該使用什么:字段級轉換器或類級自定義?

有什么方法可以避免在這些自定義轉換器/映射器中的字段值設置中發生反射

好的,所以我設法解決了這個問題(不是說它很漂亮)。

基本上,我發現 Orika 不能按原樣“離開”字段。 如果您實際上進行了從字段到字段的映射,那么該值將被設置為任何值。

我使用反射讀取所有字段並執行以下邏輯:

if field has no @IfStartsWith annotation 
then it's mapped as usual:
   classMapBuilder.fieldAToB(*).fieldBToA(*)
if field has custom annotation 
then I create a CustomMapper object that handles the logic.

請注意,這是一個類級別的自定義映射器。

這里重要的是你不要做標准映射(fieldAToB、default 和其他)。 在自定義映射器 Orika 甚至不知道有這樣一個字段之前,它必須被映射。 自定義映射器使用反射(因為我事先不知道哪個字段會以這種方式映射)。

希望這會幫助某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM