运行时Orika可选的转换/映射

时间:2019-03-31 12:21:23

标签: java mapping dto orika

我正在使用Orika映射器来避免样板转换器,并且有一个有趣的问题。 为了简化开发,我需要创建一个批注,该批注将确定何时映射值以及何时将其保留为原样(不为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映射器,从所需的类中读取此批注,并根据此设置动态映射行为。

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

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

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

这些自定义转换器/映射器中的字段值设置中是否有任何避免反射的方法

1 个答案:

答案 0 :(得分:0)

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

基本上,我发现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,默认值和其他)。在自定义映射器之前,Orika甚至不知道存在这样的字段,因此必须对其进行映射。 自定义映射器使用反射(因为我事先不知道将以这种方式映射哪个字段)。

希望这对某人有帮助。