我是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,我确信有注册字段
请帮助
答案 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它在声明中的顺序是:第一个 宣言获胜。