Orika 可选 conversion/mapping 在运行时

Orika optional conversion/mapping in runtime

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

假设我们有 2 classes:

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;

我们需要在很多 classes 中使用类似的逻辑 - 仅更改起始字符串。

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

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

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

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

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

我应该用什么:现场级转换器还是class级定制?

有什么方法可以避免反射这些自定义converters/mappers中的字段值设置吗?

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

基本上,我发现 Orika 不能 "leave" 原样。 如果您实际上在字段之间进行映射,那么该值将被设置为任何值。

我使用反射读取所有字段并执行以下逻辑:

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.

请注意,这是一个 class 级别的自定义映射器。

这里重要的是你不做标准映射(fieldAToB,默认和其他)。在自定义映射器之前,Orika 甚至不知道有这样一个字段并且必须对其进行映射。 自定义映射器使用了反射(因为我事先不知道哪个字段会被这样映射)。

希望这对某人有所帮助。