“关闭”;建筑商“;在MapStruct中使用不可变时

“关闭”;建筑商“;在MapStruct中使用不可变时,mapstruct,immutables-library,Mapstruct,Immutables Library,如何在MapStruct中完全禁用使用“构建器”?我根本不想使用它们,因为它们给我带来了各种各样的问题 我在META-INF下创建了服务文件(我更喜欢将其分配给mapping builder=的方法,但我没有看到任何示例如何在代码中正确执行) 它仍在尝试使用我要映射到的“ModifiableXXX”实例的不可变“builder”实例。如果可以的话,我甚至会将其强制为可修改类型 在另一个映射中,使用更新ModifiableXXX(使用@AfterMapping和@MappingTarget)方法有

如何在MapStruct中完全禁用使用“构建器”?我根本不想使用它们,因为它们给我带来了各种各样的问题

我在META-INF下创建了服务文件(我更喜欢将其分配给mapping builder=的方法,但我没有看到任何示例如何在代码中正确执行)

它仍在尝试使用我要映射到的“ModifiableXXX”实例的不可变“builder”实例。如果可以的话,我甚至会将其强制为可修改类型

在另一个映射中,使用更新ModifiableXXX(使用@AfterMapping和@MappingTarget)方法有效

我的映射器现在看起来像这样:

@Mapper
public interface MongoProjectMapper
{
    ModifiableProject mapModel(MongoProject project);

    @AfterMapping
    ModifiableProject updateProject(MongoEntity e, @MappingTarget ModifiableProject p);
}

可以通过
NoOpBuilderProvider
完全禁用构建器。您需要在
META-INF/services
目录中创建一个
org.mapstruct.ap.spi.NoOpBuilderProvider
文件,其内容为
org.mapstruct.ap.spi.NoOpBuilderProvider
。这将完全禁用构建器


有一个功能请求,可以通过
@BeanMapping
或在映射器级别使其更细粒度并禁用它。查看Mapstruct版本1.3.1.Final中的

,我们可以在@BeanMapping、@Mapper或@MapperConfig中使用注释org.Mapstruct.Builder#disableBuilder

@Mapper(builder = @Builder(disableBuilder = true))
public interface ProjectMapper

看一看,我不知道为什么这对我不起作用。我在Spring boot中使用Lombok和mapstruct 1.3.0.Final。我在resources:/resources/META-INF/services下添加了一个常规文件夹,在该文件夹下添加了一个名为org.mapstruct.ap.spi.BuilderProvider的常规文件。我只在文件中写了:org.mapstruct.ap.spi.NoOpBuilderProvider。mapstruct仍然在生成的资源中使用Lombok builder。我甚至添加了mapstruct处理器依赖项,因为IntelliJ找不到org.mapstruct.ap。但仍然没有。它与您的构建系统一起工作吗?您是否在maven编译器插件中设置了
AnnotationProcessorPath
(如果您使用的是maven)是的,我在maven编译器插件中设置了AnnotationProcessorPath。其中我有两条路。一个用于mapstruct processor,另一个用于lombokCan,您可以尝试删除它们并将处理器作为提供的依赖项添加。看,这有一个类似的问题。
maven编译器插件没有拾取SPI,因为它不在注释处理器类路径上。在我的例子中,我只有一个模块(因此只有一个POM文件)。我不明白我需要做什么改变。我无法将提议的PR调整为单个模块项目