【问题标题】:MapStruct - Cannot find implementationMapStruct - 找不到实现
【发布时间】:2020-08-25 20:40:09
【问题描述】:

使用最新的 Springboot 和 MapStruct 版本并使用 Maven 构建,我正在尝试实现 the official MapStruct site 中给出的“从这里开始”示例

我的代码更简单:

pom.xml

<org.mapstruct.version>1.3.1.Final</org.mapstruct.version>

(...)

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${org.mapstruct.version}</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>${org.mapstruct.version}</version>
                </path>
            </annotationProcessorPaths>
        </configuration>
    </plugin>

汽车.java

public class Car {

    private String model;

    // Constructors, setters and getters...

}

CarDto.java

public class CarDto {

    private String theModel;

    // Constructors, setters and getters...

}

CarMapper.java 接口

@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );

    @Mapping(source = "model", target = "theModel")
    CarDto carToCarDto(Car car);
}

主要应用

@SpringBootApplication
public class MappertestApplication {

    public static void main(String[] args) {
        SpringApplication.run(MappertestApplication.class, args);

        Car c = new Car("Volkswagen");

        CarDto cdto = CarMapper.INSTANCE.carToCarDto(c);

    }

}

所有代码都在这个公共仓库中:https://github.com/pgbonino/mappertest

运行时出现这个错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.gallelloit.mappertest.MappertestApplication.main(MappertestApplication.java:14)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Cannot find implementation for com.gallelloit.mappertest.CarMapper
    at org.mapstruct.factory.Mappers.getMapper(Mappers.java:61)
    at com.gallelloit.mappertest.CarMapper.<clinit>(CarMapper.java:10)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: Cannot find implementation for com.gallelloit.mappertest.CarMapper
    at org.mapstruct.factory.Mappers.getMapper(Mappers.java:75)
    at org.mapstruct.factory.Mappers.getMapper(Mappers.java:58)
    ... 2 more

我在官方 MapStruct 项目中找到了this issue,它似乎描述了同样的问题。但是,在这种情况下,正在执行一些自定义配置(实现的自定义名称)。在我的情况下,一切都保留为默认值。

有什么想法吗?

【问题讨论】:

  • 你找到解决办法了吗?

标签: java spring-boot maven mapping mapstruct


【解决方案1】:

虽然我的情况与您的情况不同,但它确实导致了相同的错误 - 因此我发布此答案是为了帮助其他与我犯相同错误并最终在这里寻找解决方案的人。

我正在导入 maven 依赖项:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${org.mapstruct.version}</version>
</dependency>

但是忘记在maven编译插件中添加注解处理器路径:

    <annotationProcessorPaths>
        <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
        </path>
    </annotationProcessorPaths>

【讨论】:

    【解决方案2】:

    我添加了 mapstruct 处理器依赖项,它对我有用

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.3.1.Final</version>
    </dependency>
    

    【讨论】:

      【解决方案3】:

      您需要确保您的 IDE 已正确配置为调用注释处理器。看看IDE Setup

      查看您提供的项目,代码甚至不应该编译。 MapStruct 处理器将发出编译错误,原因是:

      • CarDto 中没有默认构造函数
      • Car 中不存在属性model(只有marca
      • CarDto 中不存在属性theModel(只有laMarca

      【讨论】:

      • 感谢您的回答。在昨天的某个时刻,我推动了一些更改,只是为了将 marca 翻译成模型(西班牙语到英语)。但我不认为因为这个原因存在编译错误。没有默认构造函数。无论如何,我会添加它。我最后做的是给出一个 Spring 策略,将 Mapper 配置为上下文中的 bean 并将其注入客户端。我想知道当我提出一个对我来说不再有意义的问题时,我在 stackoverflow 中会做什么。无论如何,非常感谢您的回答和帮助:)
      • 您的回答没有任何帮助,因为它没有给出任何适当的问题原因。错误指出Cannot find implementation,据我推测,这意味着该接口不是由 MapStruct 实现的。为什么 MapStruct 提供了正确的注解后仍然没有实现提供的接口?
      • @Chetan,答案对用户没有帮助,因为还有另一个问题。但是,该问题通常在注释处理器未运行时出现,即 IDE 未正确配置。
      • 我单击了您为 IDE 设置提供的链接。我遵循了 Eclipse IDE 所需的所有步骤。然而它并没有帮助我。我仍然收到声明 Cannot find implementation 的错误消息。
      【解决方案4】:

      当我在我的项目上运行给定的命令时,我的问题得到了解决 -

      mvn clean install
      

      然后我注意到正在生成实现文件。我猜想生成实现需要执行 maven 命令。

      【讨论】:

        【解决方案5】:

        尝试在 Eclipse IDE 中配置 MapStruct Eclipse 插件 来解决问题。

        【讨论】:

          【解决方案6】:

          使用@Mapper(componentModel = "spring")是正确的

          在你的 Mapper 类上,这样你就可以贪得无厌地使用注入,像这样:

          @Autowired
          private CarMapper carMapper;
          

          为了检查一切是否正常,你可以在编译后检查你的映射器实现。它应该有@component。像这样

          @Component
          public class CarMapperImpl implements CarMapper {
          

          【讨论】:

            【解决方案7】:

            我正在重现完全相同的错误,因为我忘记将@Mapper 添加到映射器界面

            @Mapper // <-- missing
            public interface MyMapper {
            

            这是一个微不足道的错误,但很容易错过

            【讨论】:

              猜你喜欢
              • 2021-03-06
              • 1970-01-01
              • 2022-11-07
              • 2021-04-15
              • 2021-10-19
              • 2020-08-14
              • 2021-09-23
              • 1970-01-01
              • 2019-10-10
              相关资源
              最近更新 更多