【问题标题】:Turn off "builders" in MapStruct when using Immutables使用 Immutables 时关闭 MapStruct 中的“构建器”
【发布时间】:2019-02-12 17:25:20
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: mapstruct immutables-library


    【解决方案1】:

    从 Mapstruct 版本 1.3.1.Final 我们可以在 @BeanMapping、@Mapper 或 @MapperConfig 中使用注解 org.mapstruct.Builder#disableBuilder

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

    看看#mapping-with-buildersdocumentation

    【讨论】:

      【解决方案2】:

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

      有一个功能请求通过@BeanMapping 或在映射器级别使其更细化并禁用它。看看mapstruct/mapstruct#1661

      【讨论】:

      • 我不知道为什么这对我不起作用。我在 Spring Boot 中使用 Lombok 和 mapstruct 1.3.0.Final。我在资源下添加了一个常规文件夹:/resources/META-INF/services,在该文件夹下添加了一个名为 org.mapstruct.ap.spi.BuilderProvider 的常规文件。进入我只写的文件:org.mapstruct.ap.spi.NoOpBuilderProvider。 mapstruct 在生成的资源中仍然使用 Lombok 构建器。我什至添加了 mapstruct-processor 依赖项,因为 IntelliJ 找不到 org.mapstruct.ap。但还是什么都没有。
      • 它适用于您的构建系统吗?您的 maven-compiler-plugin 中是否有 annotationProcessorPaths(如果您使用的是 maven)
      • 是的,我在 maven-compiler-plugin 中设置了 annotationProcessorPaths。在其中我有 2 条路径。一个用于 mapstruct-processor,另一个用于 lombok
      • 您能否尝试删除它们并将处理器添加为提供的依赖项。看看有类似问题的mapstruct/mapstruct#1713。 SPI 未被maven-compiler-plugin 拾取,因为它不存在于注释处理器类路径中
      • 就我而言,我有一个模块(所以只有一个 POM 文件)。我无法理解为此我需要做的更改。我无法将提议的 PR 用于单个模块项目
      猜你喜欢
      • 2020-10-04
      • 2019-09-17
      • 2022-01-13
      • 1970-01-01
      • 2010-12-28
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多