MapStruct 不使用 Kotlin 和 Spring Boot 自动装配,使用 Gradle 构建

Posted

技术标签:

【中文标题】MapStruct 不使用 Kotlin 和 Spring Boot 自动装配,使用 Gradle 构建【英文标题】:MapStruct not autowiring with Kotlin and Spring Boot, built using Gradle 【发布时间】: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 不能使用这种设置吗?

【问题讨论】:

这可能会有所帮助:***.com/questions/44458089/… 我已经看过了。 “解决方案”是使用接口,这正是我所做的。 “最佳”答案基本上是手写映射的人。那根本没有使用 MapStruct。我想强调的是,我使用的是 Kotlin,而不是 Java——尽管它们使用相同的 JVM,但 Kotlin 似乎需要一些变通方法才能让事情正常工作。 你得到的异常基本上是说:我不知道我应该自动装配哪个类,请创建一个类型为 xyz 的类。虽然没有多大意义,但是你可以用@component注解映射器,这样通常可以解决这个问题。 关于另一篇文章:我指的是Minnow的答案 我明白这一点。而且我已经尝试过 Minnow 的解决方案(或至少几个 gradle 变体),但都没有奏效。 【参考方案1】:

尝试添加

kapt("org.mapstruct:mapstruct-jdk8:1.3.1.Final")

我在使用 kotlin 和 gradle 的 springboot 中使用 mapstruct。 自动装配一切正常,这就是我所拥有的:

apply plugin: "kotlin-kapt"

compile "org.mapstruct:mapstruct:1.3.1.Final"

kapt("org.mapstruct:mapstruct-processor:1.3.1.Final")
kapt("org.mapstruct:mapstruct-jdk8:1.3.1.Final")

接口的配置:

@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)

【讨论】:

以上是关于MapStruct 不使用 Kotlin 和 Spring Boot 自动装配,使用 Gradle 构建的主要内容,如果未能解决你的问题,请参考以下文章

MapStruct类型之间映射的实现

MapStruct类型之间映射的实现

MapStruct类型之间映射的实现

mapstruct对象复制&转换

mapstruct对象复制&转换

MapStruct,对象装载结构工具