Mapstruct不会在生成的源文件中更新其getter和setter

时间:2019-07-02 09:12:42

标签: java spring lombok mapstruct

我有一个实体,该实体具有我以前这样写的属性 私人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,则不会将其方法更新为setIcugetIcu

我无法手动更改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更新其生成的源文件吗?

3 个答案:

答案 0 :(得分:6)

您需要按顺序先提供lombok 插件,然后像这样提供ma​​pstruct-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将能够看到其获取器和设置器。

(您可以查看我的project及其demo来查看实际操作。)