【问题标题】:Orika optional conversion/mapping in runtimeOrika 运行时的可选转换/映射
【发布时间】:2019-08-21 18:37:57
【问题描述】:

我正在使用 Orika 映射器来避免样板转换器并遇到一个有趣的问题。 为了简化开发,我需要创建一个 Annotation 来确定何时映射值以及何时保持原样(不是 null 或默认值,就这样)。

假设我们有 2 个类:

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

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

Dto 来自前端,我们希望仅当字段名称以以下内容开头时才将其映射到实体:

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

而且我们在很多类中都需要类似的逻辑——只是改变了起始字符串。

所以我想创建注释@IfStartsWith(String startsWith) 并执行以下操作:

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

在项目启动时,我想配置 Orika 映射器,从所需的类中读取此注释并根据此设置动态映射行为。

这里重要的是我不能使用默认值(null 或空字符串),因为如果检查失败,我需要保持目标值不变。 “按原样”表示现有目标对象中的值或类默认值(设置为public String name = "My name";

我知道如何从字段中获取注释并且它现在可以工作,但问题是:

我应该使用什么:字段级转换器还是类级自定义?

有什么方法可以避免这些自定义转换器/映射器中的字段值设置反射

【问题讨论】:

    标签: java mapping dto orika


    【解决方案1】:

    好的,所以我已经设法解决了这个问题(不是说它很漂亮)。

    基本上,我发现 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 甚至不知道有这样一个字段并且必须对其进行映射。 自定义映射器使用反射(因为我事先并不知道会以这种方式映射哪个字段)。

    希望这会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-20
      • 2017-03-22
      • 2018-02-19
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      相关资源
      最近更新 更多