首页 > 解决方案 > Mapstruct 找不到 impl

问题描述

我正在使用 mapstruct 将 DTO 转换为对象,反之亦然,我得到以下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.rppjs.customer.online.portal.dtos.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1506)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:819)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:725)

我可以看到UserMapper.impl正在生成,但仍然是上述异常。我的代码在这个分支 42_RenameCodeBaseToCustomerOnlinePortal 的 github 上。代码很简单,代码行数也不多。异常是作为RegistrationEndpointIT.java.

请你看看我哪里出错了?它正在使用 gradle 包装器。

此外,运行 Application.java 时出现以下异常:

描述:

com.rppjs.customer.online.portal.endpoints.RegistrationEndpoint 中构造函数的参数 0 需要一个无法找到的 'com.rppjs.customer.online.portal.dtos.mapper.UserMapper' 类型的 bean。

行动:

考虑在您的配置中定义“com.rppjs.customer.online.portal.dtos.mapper.UserMapper”类型的 bean。

请注意,Application.java 是一个 Spring 启动应用程序。

标签: javaspring-bootmapstruct

解决方案


问题是RegistrationEndpoint使用映射器作为构造函数参数。因为它是一个组件,所以 Spring 想要自动装配它。但春豆UserMapper也不UserMapperImpl是,因此例外。

你有两个选择:

  1. 删除UserMapper构造函数参数并使用Mappers.getMapper(UserMapper.class). 最好的做法是MAPPER在您的映射器中也公开实例(请参见此处的示例

  2. 如果您需要在映射器中自动装配依赖项,您可以将映射器定义为 spring bean,如下所示:


@Mapper(componentModel  = "spring")
@Component
public interface UserMapper() {
   //...
}

推荐阅读