我有一个实体,该实体具有我以前这样写的属性 私人Long ICU;
我正在使用mapstruct:
这是该实体的我的映射器:
@Mapper(componentModel = "spring")
public interface ProtectionQueryMapper extends EntityMapper<ProtectionQueryDto, Protection> {
ProtectionQueryDto toDto(Protection protection);
Protection toEntity(ProtectionQueryDto protectionQueryDto);
List<Protection> toEntity(List<ProtectionQueryDto> protectionQueryDtos);
List<ProtectionQueryDto> toDto(List<Protection> protections);
}
public interface EntityMapper<D, E> {
E toEntity(D dto);
D toDto(E entity);
List<E> toEntity(List<D> dtoList);
List<D> toDto(List<E> entityList);
}
我遇到的问题是我想从ICU go icu更改属性,这导致了此错误:
嵌套的异常是java.lang.NoSuchMethodError:
Protection.getICU()Ljava / lang / Long;
似乎mapstruct根据以下内容生成了它的getter和setter:
private Long ICU;
setICU和getICU之类的生成方法。
但是,既然我已将属性从ICU更改为icu mapstruct,则不会将其方法更新为setIcu
和getIcu
。
我无法手动更改mapstruct
生成的文件。
这也是我的pom.xml(至少是有关mapstruct的部分)
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.0.Final</version>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
有什么想法要让mapstruct更新其生成的源文件吗?
答案 0 :(得分:6)
您需要按顺序先提供lombok 插件,然后像这样提供mapstruct-processor 插件。
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
答案 1 :(得分:2)
由于某种原因,项目的重新编译未运行注释处理器。 Java编译器将调用MapStruct,而maven-compiler-plugin负责使用生成的类清理文件夹。
执行mvn clean compile
将始终有效。但是,如果没有做任何更改,然后再做mvn compile
,我将尝试使用最新版本的maven-compiler-plugin,如果仍然无效,请为该插件创建一个错误报告。>
答案 2 :(得分:0)
如果将Lombok用于实体和DTO,则必须像这样更新pom.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
然后Mupstruct将能够看到其获取器和设置器。