java - MapStruct 根据目标类型映射正确的对象实例

标签 java spring jackson jackson2 mapstruct

如何正确映射具有相同父级的不同类

spring DTO jackson 对象

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type",
    )
@JsonSubTypes(value = {
            @JsonSubTypes.Type(value = B.class, name = "TypeB"),
            @JsonSubTypes.Type(value = C.class, name = "TypeC")
})
abstract class A {
   Type type;
   String id;
}


class B extends A {
    String name;  
}


class C extends A {
   String description;
}

实体类包含所有字段

class myEntity {
    Type type;
    String id;
    String name;  
    String description;
} 

MapStruct 映射器

public abstract class IntegrationMapper  {
    public A toDto(MyEntity myEntity);
    public MyEntity fromDto(A integrationDTO)  
}

如何根据类型值在toDto中创建不同的实例B或C

我就是这样使用的

public abstract class IntegrationMapper {
    public A toDto(MyEntity myEntity) {
        if(myEntity.type == TypeB) {
            return toB(myEntity);
        } else if (myEntity.type == TypeC) {
            return toC(myEntity);            
        }
    }

    public MyEntity fromDto(A a)  {
        if(a instanceOf B) {
            return fromDto((B) a);
        } else if (a instanceOf C) {
            return fromDto((C) a);
        }
    }

    protected B toB(MyEntity myEntity);
    protected C toC(MyEntity myEntity);

    protected MyEntity fromDto(B c);
    protected MyEntity fromDto(C c);

}

但我怀疑使用 ObjectFactory 或类似的东西可以做得更好

避免冗长的if语句并为A的每个新子级创建新方法

最佳答案

如果要对B中的字段进行映射和C您必须为它们创建方法。 MapStruct 是代码生成,因此它不知道有关运行时类型的任何信息。

您当前的方法是寻找您想要的东西的方法。我不认为使用 ObjectFactory可以帮助你。它可以帮助您的唯一方法是如果您想映射MyEntity到基地A 。在这种情况下,它只会生成基础和实体之间的映射,这不是您正在寻找的。

有一个开放的功能请求 ( #131 ),可以为您生成这些检查实例。

关于java - MapStruct 根据目标类型映射正确的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802162/

相关文章:

spring-boot - Spring 数据休息 : @Autowire in Custom JsonDeserializer

java - Elasticsearch批量索引Java API不工作

java - 使用最小数量的矩形覆盖 "Manhattan skyline"

java - 如何使用 armed bear common lisp 创建一个 jar?

java - 春java.lang.IllegalStateException : Cannot create a session after the response has been committed

javascript - Spring session 超时重定向到登录

java - Java程序中的Bizzare System.out.println()

java - 如何将变量从一个 Spring MVC Controller 获取到另一个

java - 如何使用 jackson mapper 将空字符串映射到 Map

java - Gradle中的依赖阴影