我正在使用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";
)
我知道如何从字段中获取注释,并且现在可以使用,但是问题是:
我应该使用什么:字段级转换器或类级自定义?
这些自定义转换器/映射器中的字段值设置中是否有任何避免反射的方法?
答案 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甚至不知道存在这样的字段,因此必须对其进行映射。 自定义映射器使用反射(因为我事先不知道将以这种方式映射哪个字段)。
希望这对某人有帮助。