java - Mapstruct 生成的类使用父级而不是子级的 Lombok 构建器

标签 java mongodb lombok mapstruct

我有类A(域类),类B(mongo db存储库层类)扩展A,并且它们都有Lombok @Builder。我需要在它们之间进行转换,当我为此使用 Mapstruct 时,实现转换类在生成类型 B 的对象时使用 A 中的 Builder。这会导致由于“不兼容类型”而导致构建失败。如何解决这个问题?

@Builder
class A {

}

@Document
@Builder
class B extends A{
}

@Mapper
public interface ClassMapper {
   B mapToDocument(A domainObject);
}

此代码生成以下 Mapstruct 文件:

public class ClassMapperImpl implements ClassMapper{
   @Override
   public B mapToDocument(A domainObject){
      if(domainObject == null){
         return null;
      }
      Builder builder = A.builder();
      //builder methods
      return builder.build(); //incompatible types due to builder generating A objects, not B
   }
}

最佳答案

即使没有映射器,您的代码也无法编译。 Lombok 提示 B 类中的 @Builder 返回了不兼容的类型:

The return type is incompatible with A.builder()

因为.builder()方法是静态的,所以不能使用继承机制。

另一个解决方案是在 A 类上使用 @Getter,在 B 类上使用 @Setter,并让 mapstruct 为您完成映射。

关于java - Mapstruct 生成的类使用父级而不是子级的 Lombok 构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58929524/

相关文章:

mongodb - 查找聚合中的局部变量不起作用

mongodb - 与 dockerfile 中的 CMD 和 ENTRYPOINT 混淆

mongodb - 无法在 debian 上初始化副本集(在 createPrivateMap 中打开/创建失败)

Java SneakyThrow of exceptions,类型删除

java-9 - module-info.java 不适用于 Java 9 中的 lombok

java - 有人可以帮助解释这两个线程的输出吗?

java - 无法在 JPA2 中使用继承的复合键作为派生 id

java - android studio 每 X 秒自动刷新线程中的数据 json url

java - Lombok 的@SuperBuilder-错误Java : cannot find symbol

java - 如何在非父 Activity 中更改小部件