Java Mapstruct生成的类使用父级而不是子级的Lombok生成器

Java Mapstruct生成的类使用父级而不是子级的Lombok生成器,java,mongodb,lombok,mapstruct,Java,Mongodb,Lombok,Mapstruct,我有A类(域类),B类(mongo db repository layer类)扩展了A,它们都有Lombok@Builder。我需要在它们之间进行转换,当我为此使用Mapstruct时,实现转换类在生成类型B的对象时使用来自A的生成器。这会导致由于“不兼容类型”而导致生成失败。如何解决这个问题 @Builder class A { } @Document @Builder class B extends A{ } @Mapper public interface ClassMapper {

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

@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返回了不兼容的类型:

返回类型与.builder()不兼容

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


另一种解决方案是在类上使用@Getter,在类B上使用@Setter,并让mapstruct为您进行映射。

@Builder
与继承结合使用时效果不佳。但是,mapstruct还可以与专为此类用例设计的
@SuperBuilder
一起使用


删除所有
@Builder
并将
@SuperBuilder
放在继承层次结构的所有类上。

可以禁用生成器,请参阅手册

如果要禁用使用构建器,则可以使用NoOpBuilderProvider,方法是在META-INF/services目录中创建一个org.mapstruct.ap.spi.BuilderProvider文件,并将org.mapstruct.ap.spi.NoOpBuilderProvider作为其内容


这解决了问题

我也有同样的问题,但我正在使用SuperBuilder。当Mapstructs生成实现时,它使用父级的生成器。你有什么暗示吗?