当前位置: 首页 > 知识库问答 >
问题:

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

宦飞
2023-03-14

我有一个实体,拥有一个我曾经写过的像这样的私人长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去icu,我做到了,它导致了这个错误:

嵌套异常是java.lang.NoSuchMultiodError:

Protection.getICU()Ljava/lang/Long;

mapstruct似乎基于以下内容生成其getter和setter:private Long 生成方法,如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个答案

江鸿羲
2023-03-14

如果将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>
                        <arg>-Amapstruct.defaultComponentModel=spring</arg>
                    </compilerArgs>
                </configuration>
            </plugin>

然后Mupstruct将能够看到他们的getter和setter。

(您可以查看我的项目及其演示以查看此操作。)

尉迟浩思
2023-03-14

由于某种原因,项目的重新编译没有运行注释处理器。Java编译器调用MapSTRt,maven-编译器-插件负责用生成的类清理文件夹。

执行mvn干净编译将始终有效。但是,如果做了一个更改,然后又做了mvn compile,那么我会尝试使用最新版本的maven编译器插件,如果仍然不起作用,我会为插件创建一个bug报告。

闻人英韶
2023-03-14

您需要先提供lombok插件,然后像这样提供mapstruct处理器插件。

<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>
 类似资料:
  • 我想知道为什么我的映射器由映射结构生成的映射器不是用获取器和设置器生成的。 我认为正因为如此,当我去对邮递员发出GET请求时,它会返回所有不应该返回空值的空值。 我使用专家,java 8和Spring启动 pom.xml文件: 映射器: 实体DTO: 实体: 映射器实现: 如果有人知道怎么解决,请帮忙。谢谢;)

  • 当使用“JSR330”componentModel使用MapStruct生成映射器实现时,micronaut将在运行时尝试注入这些实现时抛出一个NoSuchBeanException。 一个解决办法是使用提供程序来提供映射器对象,但生成的代码应该可以工作。 映射器定义: 控制器: pom.xml摘录: 当调用控制器上的方法时,我会期望Micronaut找到Mapstruct生成的类(它用@sing

  • 我是log4j的新手。我创建了一个在其中实现log4j的示例java程序。 下面是java程序: 我正在控制台屏幕上获取输出。但是没有生成日志文件。我还使用以下链接在Eclipse neon中配置了我的项目:配置 我做了一切好事。但是日志文件没有生成。当我以编程方式实现log4j时,文件正在生成。以下是我的属性文件: 我需要做什么才能让Log4J写入日志文件?

  • 菜单栏: Code —> Generate —> Getter and Setter Mac: command + N Windows\/Linux: Alt + Insert —> Getter and Setter