gpt4 book ai didi

maven - Mapstruct 不使用 Lombok 定义的构建器

转载 作者:行者123 更新时间:2023-12-03 17:11:34 26 4
gpt4 key购买 nike

解决方案:

我不得不更改我的 mapstruct 的顺序和 lombok annotationProcessorPaths .

我不得不放置 mapstruct以上lombok ,然后它起作用了。

我将下面的 pom 更新为工作版本,所以这里没有非工作代码。

我还将 lombok 版本转换回当前版本,而不使用边缘版本。

原始问题:

我有 2 组或多或少相同的类(参见下面的示例)

  • 一组是我的 API 的 DTO,我希望它是不可变的,使用 Lombok 的 @Value 和 @Builder
  • 一组是要存储在数据库中的实体。与 Lombok 的@Data

  • 最初,我将项目设置为使用:
  • Lombok 1.18.12
  • Mapstruct 1.3.1
  • Java 11
  • 马文

  • 我发现 Lombok 文档解释了如何将注释处理器添加到 maven-plugin
    https://projectlombok.org/setup/maven

    但是在执行时我仍然得到 Error:(16,25) java: ClassX does not have an accessible parameterless constructor.
    搜索此消息时,我发现了一些 2 到 3 年的问题,但没有最新消息。我还看到,这些帖子的问题已解决。

    在将项目拆分为模块时,至少在其中一篇文章中提到了它的工作原理。这也对我有用。当我将 DTO 移动到另一个 maven 模块时,在那里构建它们并设置它工作的依赖项,但这绝对不是我想要的项目结构。此外,因为我可能还需要将我的实体移出,并且我不想为我正在创建的每个 Pojo 结构创建一个新模块。

    我还在 Lombok Edge 版本上找到了该帖子:
    https://projectlombok.org/download-edge
    更改列表中的第二点是

    BREAKING CHANGE: mapstruct users should now add a dependency to lombok-mapstruct-binding. This solves compiling modules with lombok (and mapstruct).



    所以我也试过了。
    我将存储库添加到我的 pom 中,添加了 lombok-mapstruct-binding 并将 lombok 版本设置为 edge-SNAPSHOT

    但即使在清理之后,编译步骤也会失败。

    在这期间,我也更改了我的 DTO 以使用 @Data,但我想将它改回来。

    最后,这里有一些关于代码的示例和详细信息。

    DTO
    @Data
    @AllArgsConstructor(access = AccessLevel.PROTECTED)
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
    @JsonSubTypes({
    @JsonSubTypes.Type(value = BDto.class, name = "b"),
    @JsonSubTypes.Type(value = CDto.class, name = "c")
    })
    public abstract class ADto {
    private long id;
    private String type;
    private Set<String> metadata;
    private Set<String> tags;
    }

    @Data
    @NoArgsConstructor(access = AccessLevel.PRIVATE)
    public class BDto extends ADto {
    private String path;

    @Builder
    private BDto(long id, String path, Set<String> metadata, Set<String> tags) {
    super(id, "b", metadata, tags);
    this.path = path;
    }
    }

    @Data
    @NoArgsConstructor(access = AccessLevel.PRIVATE)
    public class CDto extends ADto {
    private String name;
    private Set<A> collection;

    @Builder
    private CDto(long id, String name, Set<A> collection, Set<String> metadata, Set<String> tags) {
    super(id, "c", metadata, tags);
    this.collection = collection;
    this.name = name;
    }
    }

    实体
    @Entity
    @Table
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "type")
    @AllArgsConstructor
    @NoArgsConstructor
    @Getter
    public abstract class A extends PanacheEntityBase {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected long id;

    @Column(name = "type", insertable = false, updatable = false)
    private String type;

    /* ... */
    }

    @Entity
    @DiscriminatorValue("b")
    @NoArgsConstructor
    @Getter
    @ToString
    public class B extends A {
    public B(long id, String path, Set<String> metadata, Set<Tag> tags) {
    super(id, "b", metadata, tags);
    this.path = path;
    }

    public B(String path) {
    super(0, "b", new HashSet<>(), new HashSet<>());
    this.path = path;
    }

    @Column(name = "path")
    @Setter
    private String path;
    }

    @Entity
    @DiscriminatorValue("c")
    @NoArgsConstructor
    @Getter
    public class C extends A {
    public C(long id, String name, List<A> collection, Set<String> metadata, Set<Tag> tags) {
    super(id, "c", metadata, tags);
    this.collection = collection;
    this.name = name;
    }

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "c_id")
    @OrderBy("order")
    List<A> collection;
    }

    映射器
    public interface AMapper {
    default String tagToDto(Tag tag) {
    return tag.getTag();
    }

    default Tag tagFromDto(String tag) {
    return Tag.createIfNotExists(tag);
    }
    }

    @Mapper()
    public interface BMapper extends AMapper {
    @Override
    @Mapping(target = "tags",
    qualifiedByName = "tagToDto")
    BDto toDto(B b);

    @Override
    @Mapping(target = "tags",
    qualifiedByName = "tagToEntity")
    B toEntity(BDto b);
    }

    @Mapper()
    public interface CMapper extends AMapper {
    @Override
    @Mapping(target = "tags",
    qualifiedByName = "tagToDto")
    CDto toDto(C b);

    @Override
    @Mapping(target = "tags",
    qualifiedByName = "tagToEntity")
    C toEntity(CDto b);
    }

    绒球
    <?xml version="1.0"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>dummy</artifactId>
    <groupId>dummy</groupId>
    <version>0.1.0</version>
    <packaging>pom</packaging>

    <properties>
    <compiler-plugin.version>3.8.1</compiler-plugin.version>
    <maven.compiler.parameters>true</maven.compiler.parameters>

    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <lombok.version>1.18.12</lombok.version>
    <mapstruct.version>1.3.1.Final</mapstruct.version>
    </properties>

    <repositories>
    <repository>
    <id>projectlombok.org</id>
    <url>https://projectlombok.org/edge-releases</url>
    </repository>
    </repositories>

    <dependencies>
    <!-- other stuff -->

    <!-- Tools -->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
    <!-- <scope>provided</scope> -->
    </dependency>
    <dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${mapstruct.version}</version>
    </dependency>
    <dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>${mapstruct.version}</version>
    </dependency>
    </dependencies>

    <build>
    <plugins>
    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${compiler-plugin.version}</version>
    <configuration>
    <annotationProcessorPaths>
    <annotationProcessorPath>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>${mapstruct.version}</version>
    </annotationProcessorPath>
    <annotationProcessorPath>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
    </annotationProcessorPath>
    </annotationProcessorPaths>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>

    最佳答案

    使用 lombok (1.18.18) 和 mapstruct (1.4.2.Final) 在我之后一切正常:

  • 添加插件lombok-mapstruct-binding
  • 将 lombok-mapstruct-binding 添加到 annotationProcessorPaths插件部分maven-compiler-plugin

  • 链接:
  • github 示例 pom.xml:https://github.com/mapstruct/mapstruct-examples/blob/master/mapstruct-lombok/pom.xml
  • 来自 https://mapstruct.org/faq/ :If you are using Lombok 1.18.16 or newer you also need to add lombok-mapstruct-binding in order to make Lombok and MapStruct work together.
  • 关于maven - Mapstruct 不使用 Lombok 定义的构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62374094/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com