[英]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.