我正在使用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
,但仍然是上述异常。我的代码在github上此分支42_RenameCodeBaseToCustomerOnlinePortal上。该代码非常简单,并且没有多少行代码。异常是作为RegistrationEndpointIT.java
的一部分生成的。
请你看看我要去哪里错了吗?它正在使用gradle包装器。
此外,运行Application.java时出现以下异常:
说明:
构造函数的参数0 com.rppjs.customer.online.portal.endpoints.RegistrationEndpoint 需要一个类型的bean 'com.rppjs.customer.online.portal.dtos.mapper.UserMapper' 找不到。
操作:
考虑定义一个类型的bean 您的'com.rppjs.customer.online.portal.dtos.mapper.UserMapper' 配置。
请注意,Application.java是Spring引导应用程序。
答案 0 :(得分:0)
问题在于RegistrationEndpoint
使用映射器作为构造函数参数。由于它是Spring想要自动装配的组件。但是UserMapper
和UserMapperImpl
都不是Spring bean,因此是例外。
您有两个选择:
删除UserMapper
构造函数参数,并使用Mappers.getMapper(UserMapper.class)
获取映射器。最好的方法是在映射器中也公开MAPPER
实例(请参见the example here)
如果需要在映射器内部自动关联依赖项,则可以将映射器定义为spring bean,如下所示:
@Mapper(componentModel = "spring")
@Component
public interface UserMapper() {
//...
}