【发布时间】:2020-01-17 14:31:30
【问题描述】:
我的 gradle 文件中有以下部分:
apply plugin: 'kotlin-kapt'
...
compile("org.mapstruct:mapstruct:1.3.0.Final")
kapt("org.mapstruct:mapstruct-processor:1.3.0.Final")
我也在使用 JUnit 5。
我的映射器看起来像:
@Mapper(componentModel = "spring")
interface ModelMapper {
fun convertToDto(forms: Model): DTO
@InheritInverseConfiguration
fun convertToModel(dto: DTO): Model
}
我正在尝试自动连接它,类似于:
@Service
@Transactional
class MyService @Autowired constructor(
private val repository: MyRepository,
private val mapper: ModelMapper
) {
...
}
但是当我尝试运行测试/构建时,我得到一个错误:
...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type '....ModelMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
有人知道为什么 Spring Boot 不能使用这种设置吗?
【问题讨论】:
-
我已经看过了。 “解决方案”是使用接口,这正是我所做的。 “最佳”答案基本上是手写映射的人。那根本没有使用 MapStruct。我想强调的是,我使用的是 Kotlin,而不是 Java——尽管它们使用相同的 JVM,但 Kotlin 似乎需要一些变通方法才能让事情正常工作。
-
你得到的异常基本上是说:我不知道我应该自动装配哪个类,请创建一个类型为 xyz 的类。虽然没有多大意义,但是你可以用@component注解映射器,这样通常可以解决这个问题。
-
关于另一篇文章:我指的是Minnow的答案
-
我明白这一点。而且我已经尝试过 Minnow 的解决方案(或至少几个 gradle 变体),但都没有奏效。
标签: spring-boot gradle kotlin dependency-injection mapstruct