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

     2023-02-27     195

关键词:

【中文标题】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类型之间映射的实现(代码片段)

前言本篇文章会介绍MapStruct是什么,如何使用mapstruct,使用的什么原理达到实体类之间映射;MapStruct在使用上简化了不同类之间映射问题,而对比其他类映射框架来说MapStruct有什么优缺点也;我们在开发过程中使不... 查看详情

mapstruct类型之间映射的实现(代码片段)

前言本篇文章会介绍MapStruct是什么,如何使用mapstruct,使用的什么原理达到实体类之间映射;MapStruct在使用上简化了不同类之间映射问题,而对比其他类映射框架来说MapStruct有什么优缺点也;我们在开发过程中使不... 查看详情

mapstruct类型之间映射的实现(代码片段)

前言本篇文章会介绍MapStruct是什么,如何使用mapstruct,使用的什么原理达到实体类之间映射;MapStruct在使用上简化了不同类之间映射问题,而对比其他类映射框架来说MapStruct有什么优缺点也;我们在开发过程中使不... 查看详情

在 Hibernate 会话之外执行 Mapstruct 映射

】在Hibernate会话之外执行Mapstruct映射【英文标题】:PerformMapstructmappingoutsideofHibernatesession【发布时间】:2021-06-2014:28:02【问题描述】:我正在使用SpringData和Mapstruct,我不希望hibernate在将实体映射到dto时盲目加载所有元素。例子... 查看详情

在 kotlin 的 springboot 测试中使用和不使用 @Autowired Constructor 有啥区别

】在kotlin的springboot测试中使用和不使用@AutowiredConstructor有啥区别【英文标题】:Whatisdifferencebetweenusingandnotusing@AutowiredConstructorinspringboottestwithkotlin在kotlin的springboot测试中使用和不使用@AutowiredConstructor有什么区别【发布时间】:20... 查看详情

防止 Mapstruct 在自动映射器检测中使用方法

】防止Mapstruct在自动映射器检测中使用方法【英文标题】:PreventMapstructfromusingamethodinautomaticmapperdetection【发布时间】:2022-01-1622:46:28【问题描述】:我有一个Mapstruct映射器,我必须在其中执行一些字符串转换服务。即,从自然... 查看详情

mapstruct对象复制&转换(代码片段)

mapstruct对象复制&转换mapstruct对象复制&转换简介使用步骤简述第一步:引入相关依赖第二步:定义Mapper转换器第三步:使用Mapper转换器获取Mapper实例的方式default模式spring模式cdi模式和jsr330模式常用知识点target是... 查看详情

mapstruct使用指南(代码片段)

mapstruct使用指南介绍MapStructMapStruct依赖映射基本映射不同字段间映射不同属性名称多个源类子对象映射更新现有实例数据类型转换数据类型映射数字格式转换枚举映射集合映射List映射Set和Map映射集合映射策略目标集合实现类型... 查看详情

可以告诉 MapStruct 不执行自动映射吗?

】可以告诉MapStruct不执行自动映射吗?【英文标题】:CanMapStructbetoldtonotperformautomaticmappings?【发布时间】:2016-04-1007:59:39【问题描述】:我有一个相当大的bean(大约100个属性),它被映射到几个较小的对象中。可能会出现较小... 查看详情

mapstruct使用指南(代码片段)

MapStruct使用指南文章目录MapStruct使用指南一、背景二、简介三、MapStruct依赖1、Maven2、Gradle四、映射1、基本映射2、不同字段间映射3、多个源类4、子对象映射5、更新现有实例五、数据类型转换1、数据类型映射2、数字格式转换3、... 查看详情

MapStruct - 找不到实现

】MapStruct-找不到实现【英文标题】:MapStruct-Cannotfindimplementation【发布时间】:2020-08-2520:40:09【问题描述】:使用最新的Springboot和MapStruct版本并使用Maven构建,我正在尝试实现theofficialMapStructsite中给出的“从这里开始”示例我的... 查看详情

MapStruct 和 Lombok 不能一起工作

】MapStruct和Lombok不能一起工作【英文标题】:MapStructandLomboknotworkingtogether【发布时间】:2018-05-2010:58:10【问题描述】:正在使用的技术堆栈:Java8MapStruct:1.2.0.Final龙目岛:1.16.18IDE:IntelliJ-Lombok插件已安装最初,当我删除getter和s... 查看详情

MapStruct 未检测到构建器中的设置器

】MapStruct未检测到构建器中的设置器【英文标题】:MapStructdoesnotdetectsettersinbuilder【发布时间】:2019-09-1705:28:24【问题描述】:我正在使用spring构建一个简单的REST服务。我将我的实体与DTO分开,并使用Immutables使DTO不可变。我需... 查看详情

kotlin和java区别

...;结束,Java以;结束;Kotlin中数据类型是后置的;Kotlin方法使用fun关键字定义;Kotlin的类和方法默认是publicfinal的;Kotlin中类继承和接口实现使用:标记;Kotlin中使用var,val声明变量及属性,可以进行类型推断,编译器可以根据赋值... 查看详情

如何在 org.mapstruct.Mapping 中使用“toString()”作为源?

】如何在org.mapstruct.Mapping中使用“toString()”作为源?【英文标题】:HowcanIuse\'toString()\'assourceinorg.mapstruct.Mapping?【发布时间】:2021-12-2918:24:06【问题描述】:我想在@org.mapstruct.Mapping中使用Foo::toString作为源以下解决方案不起作用... 查看详情

mapstruct,对象装载结构工具(代码片段)

MapStruct工具使用工具名为MapStruct,用于对象与对象之间的互相转换,避免每一个字段都get/set造成麻烦。MapStruct官网地址:http://mapstruct.org/如下的演示使用到了Lombok工具,如果不熟悉的请自行了解,这里就不说... 查看详情

记录一些遇见的bug——mapstruct和lombok同时使用时,转换实体类时数据丢失问题

记录一些遇见的bug——mapstruct和lombok同时使用时,转换实体类时数据丢失问题一、问题二、原因和解决方案一、问题使用mapstruct转换实体类时发现,转换后的po类数据全部为null,查看编译后的class文件发现,应该... 查看详情

在 MapStruct 中使用多源对象设置默认值策略

】在MapStruct中使用多源对象设置默认值策略【英文标题】:SettingDefaultValueStrategywithMultipleSourceObjectinMapStruct【发布时间】:2022-01-0617:09:46【问题描述】:我想对我的源对象的映射属性生成null检查,如果源属性确实为null,则将其... 查看详情