使用MapStruct将实体映射到带有DI的DTO

时间:2015-12-29 20:51:52

标签: spring mapstruct

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

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

当我运行mvn install时出现此错误:

{{1}}

我的实体使用lombok,我确信有注册字段

请帮助

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

现在,如何让它们并排工作的最干净的解决方案是将Lombok带注释的类型和映射器移动到2个单独的项目中。查看official example in Mapstruct repo

答案 3 :(得分:1)

你不必从项目中删除lombok,也不必弄乱maven编译器插件。您只需在声明pom中的mapstruck依赖项之前声明lombok依赖项。有了这个命令,maven就可以在maptruct引用getter和setter之前取消你的类。这可能是maven依赖调解的一个特征。

  

依赖关系中介 - 这决定了依赖关系的版本   将在遇到多个版本的工件时使用。   目前,Maven 2.0仅支持使用&#34;最近的定义&#34;   这意味着它将使用最接近的依赖版本   您的项目在依赖树中。你可以随时保证   版本通过在项目的POM中明确声明它。请注意,如果   两个依赖版本在依赖关系树中处于相同的深度,   直到Maven 2.0.8没有定义哪一个会赢,但从那以后   Maven 2.0.9它在声明中的顺序是:第一个   宣言获胜。

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