MapStruct-找不到实现



使用最新的Springboot和MapStruct版本,并使用Maven构建,我正在尝试实现官方MapStruct网站中给出的"从这里开始"示例

我的代码更简单:

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>

Car.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项目中发现了这个问题,该项目似乎描述了同样的问题。然而,在这种情况下,正在执行一些自定义配置(实现的自定义名称(。在我的情况下,一切都是默认的。

知道吗?

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

我正在导入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>

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

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

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

mvn clean install

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

您需要确保IDE被正确配置为调用注释处理器。看一下IDE安装程序。

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

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

我复制了完全相同的错误,因为我忘记了将@Mapper添加到映射器接口

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

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

当我将lombok与mapstruct一起使用时,我也遇到了类似的问题,这是一个已知的问题。对我有用的是在注释ProcessorPaths中添加lombok依赖项。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<!-- This is needed when using Lombok 1.18.16 and above -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<!-- Mapstruct should follow the lombok path(s) -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>

请参考这个答案以获得完整的详细信息。

使用@Mapper(componentModel = "spring")是合适的

通过你的Mapper类,所以你将能够在使用注入时贪得无厌,就像这样:

@Autowired
private CarMapper carMapper;

为了检查一切是否正常,您可以在编译后检查您的mapper实现。它上面应该有@component。就像这个

@Component
public class CarMapperImpl implements CarMapper {

我检查了我的插件版本和应用程序(源和目标(版本,并对它们进行了同等设置。它在中起作用

您在CarMapper接口上创建的INSTANCE变量不在那里,请尝试将该实例变量移动到要转换对象的类中(在您的示例中,INSTANCE应该放在MapptertApplication类中(就像这样:private static final CarMapper carMapper = Mappers.getMapper(CarMapper.class);,对我来说这很好

尝试在IDE中启用注释处理。

我解决了更改验证库的问题

<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>3.1.1</version>
</dependency>

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

相关内容

  • 没有找到相关文章

最新更新