5

我是 mapstruct 的新手,我使用 spring 作为 DI 我跟进有关 DI 容器的 MapStruct 文档页面第 4.2 节我尝试将我的实体映射到 dto,如下所示:

@Mapper(componentModel = "spring")
public interface CustomerMapper {
@Mapping(source = "registered",target = "activeProfile")
CustomerDto customerToCustomerDto(Customer customer);
}

当我运行 mvn install 我得到这个错误:

java:27: error: No property named "registered" exists in source parameter(s).
@Mapping(source = "registered",target = "activeProfile")

我的实体使用龙目岛,我确信有注册字段

请帮忙

4

5 回答 5

5

您不必删除 Lombok。您可以将其设置为在 MapStruct 之前工作,如ahus1 https://github.com/mapstruct/mapstruct/issues/510所述

<!-- first de-lombok the sources to make getters/setters visible for mapstruct,
but *DON'T'* add the output directory to the sources, as we will only need it for mapstruct processing -->
<plugin>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-maven-plugin</artifactId>
    <version>${org.projectlombok.maven.version}</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>delombok</goal>
            </goals>
            <configuration>
                <sourceDirectory>src/main/java</sourceDirectory>
                <addOutputDirectory>false</addOutputDirectory>
                <outputDirectory>${project.build.directory}/delombok</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

<!-- use the de-lomobok files to create the necessary mappers -->
<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <version>2.2.4</version>
    <configuration>
        <defaultOutputDirectory>
            ${project.build.directory}/generated-sources/mapstruct
        </defaultOutputDirectory>
        <processors>
            <processor>org.mapstruct.ap.MappingProcessor</processor>
        </processors>
        <sourceDirectory>
            ${project.build.directory}/delombok
        </sourceDirectory>
    </configuration>
    <executions>
        <execution>
            <id>process</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>process</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<!-- now take the original sources together with the created mappers to the compiler -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.0</version>
    <configuration>
        <annotationProcessors>
            <annotationProcessor>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</annotationProcessor>
        </annotationProcessors>
    </configuration>
</plugin>
于 2016-08-19T13:22:53.527 回答
4

我已经在 pom.xml 中使用 annotationProcessors 解决了这个问题

   <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.0</version>
        <configuration>
            <annotationProcessorPaths>
                <path>
                   <groupId>org.projectlombok</groupId>
                   <artifactId>lombok</artifactId>
                   <version>${lombok.version}</version>
                </path>
                <path>
                   <groupId>org.mapstruct</groupId>
                   <artifactId>mapstruct-processor</artifactId>
                   <version>${mapstruct.version}</version>
                </path>
            </annotationProcessorPaths>
        </configuration>
  </plugin>
于 2017-08-12T11:46:28.360 回答
2

您不必从项目中删除 lombok,也不必弄乱 maven 编译器插件。您只需要在 pom.xml 中声明 mapstruck 依赖项之前声明 lombok 依赖项即可。有了这个命令,maven 可以在 mapstruct 引用 getter 和 setter 之前 de-lombok 你的类。这可能是 maven 依赖中介的一个特性。

依赖中介——这决定了当遇到工件的多个版本时将使用哪个版本的依赖。目前,Maven 2.0 仅支持使用“最近定义”,这意味着它将使用依赖树中与您的项目最接近的依赖版本。您始终可以通过在项目的 POM 中明确声明来保证版本。请注意,如果两个依赖版本在依赖树中的深度相同,则在 Maven 2.0.8 之前没有定义哪个会获胜,但从 Maven 2.0.9 开始,声明中的顺序很重要:第一个声明获胜。

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies

于 2018-03-15T16:53:10.267 回答
2

lombok从 Entity 中删除并手动创建了 setter / getters 并且运行良好

于 2015-12-29T23:51:59.587 回答
1

问题是,Lombok 生成的属性对 JSR-269 注释处理器不可见。它使用内部 api 直接修改源元素,而不是从带注释的源文件生成新的工件。因此,任何依赖于 getter/setter 方法存在的注释处理器在执行时都不会在源代码中看到它们。Javac 会将“原始”源代码传递给注解处理器(在我们的例子中为 Mapstruct),而无需 Lombok 进行任何修改。

现在,如何让它们同时工作的最简洁的解决方案是将 Lombok 注释类型和映射器移动到 2 个单独的项目中。请参阅Mapstruct repo 中的官方示例

于 2016-08-03T16:40:09.680 回答