mapstruct的spring拓展

简介: mapstruct的spring拓展

活着不一定要鲜艳,但一定要有自己的颜色。——张曙光

首先按照惯例放官网:

https://mapstruct.org/documentation/spring-extensions/reference/html/

基本的使用方式之前博客已经写过了我们就不再细表,这里简单放上链接

https://VampireAchao.gitee.io/2022/03/23/mapstruct/

在此之前还要配置对应的依赖和插件

<properties>
       <java.version>1.8</java.version>
       <!-- 编译生成代码插件版本号开始(避免mapstruct和lombok冲突,因此此处指定一个兼容的版本) -->
       <lombok.version>1.18.10</lombok.version>
       <mapstruct.version>1.3.0.Final</mapstruct.version>
       <mapstruct.spring.version>0.1.1</mapstruct.spring.version>
       <!-- 编译生成代码插件版本号结束 -->
   </properties>
<dependencies>
       <!-- 用到的GAV -->
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <version>${lombok.version}</version>
           <scope>provided</scope>
           <optional>true</optional>
       </dependency>
       <dependency>
           <groupId>org.mapstruct</groupId>
           <artifactId>mapstruct</artifactId>
           <version>${mapstruct.version}</version>
       </dependency>
       <dependency>
           <groupId>org.mapstruct.extensions.spring</groupId>
           <artifactId>mapstruct-spring-annotations</artifactId>
           <version>${mapstruct.spring.version}</version>
       </dependency>
   </dependencies>
<build>
       <plugins>
           <!-- 需要配置的插件 -->
    <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.8.1</version>
               <configuration>
                   <source>1.8</source>
                   <target>1.8</target>
                   <encoding>UTF-8</encoding>
                   <!-- lombok和mapstruct配置开始 -->
                   <annotationProcessorPaths>
                       <path>
                           <groupId>org.projectlombok</groupId>
                           <artifactId>lombok</artifactId>
                           <version>${lombok.version}</version>
                       </path>
                       <path>
                           <groupId>org.mapstruct</groupId>
                           <artifactId>mapstruct-processor</artifactId>
                           <version>${mapstruct.version}</version>
                       </path>
                       <path>
                           <groupId>org.mapstruct.extensions.spring</groupId>
                           <artifactId>mapstruct-spring-extensions</artifactId>
                           <version>${mapstruct.spring.version}</version>
                       </path>
                   </annotationProcessorPaths>
                   <!-- lombok和mapstruct配置结束 -->
               </configuration>
           </plugin>
       </plugins>
</build>


为什么要用?

因为我们之前使用中,需要对每个Mapper定义方法,然后调用对应的方法

如果对于简单的转换,能有一种能统一的规范,那样就不会乱

因此我们使用springConvert接口

完整类名为org.springframework.core.convert.converter.Converter

我们写法如下:

package com.ruben.simplescaffold.mapper.mapstruct;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.springframework.core.convert.converter.Converter;
import com.ruben.simplescaffold.entity.UserDetail;
import com.ruben.simplescaffold.pojo.vo.UserVO;
/**
 * 用户mapstruct转换mapper
 *
 * @author <achao1441470436@gmail.com>
 * @since 2022/3/23 19:18
 */
@Mapper(componentModel = "spring")
public interface MapUserMapper extends Converter<UserDetail, UserVO> {
    /**
     * po转vo
     *
     * @param userDetail po
     * @return vo
     */
    @Override
    @Mapping(source = "username", target = "uname")
    @Mapping(source = "password", target = "pwd")
    UserVO convert(UserDetail userDetail);
}

然后如果你按照官方文档接着使用:

package com.ruben.simplescaffold;
import javax.annotation.Resource;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.convert.ConversionService;
import com.ruben.simplescaffold.entity.UserDetail;
import com.ruben.simplescaffold.pojo.vo.UserVO;
/**
 * @author <achao1441470436@gmail.com>
 * @since 2022/3/23 19:22
 */
@SpringBootTest
class MapUserMapperTest {
    @Resource
    private ConversionService conversionService;
    @Test
    void convertPoToVoTest() {
        UserVO userVO = conversionService.convert(UserDetail.builder().username("ruben").password("vampire").build(), UserVO.class);
        Assertions.assertEquals("ruben", userVO.getUname());
        Assertions.assertEquals("vampire", userVO.getPwd());
    }
}

你会发现踩坑了

报错:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [com.ruben.simplescaffold.entity.UserDetail] to type [com.ruben.simplescaffold.pojo.vo.UserVO]

然后我通过debug发现是没有将转换器添加进ConversionService

因此我们只要编写一个Config添加进去即可

package com.ruben.simplescaffold.config;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.GenericConversionService;
/**
 * 转换配置
 *
 * @author <achao1441470436@gmail.com>
 * @since 2022/5/1 0:44
 */
@Configuration
public class ConvertConfig {
    /**
     * 注册我们自定义的转换器
     *
     * @param converters        转换器列表
     * @param conversionService 转换服务
     * @param <T>               转换源泛型
     * @param <R>               转换目标泛型
     */
    public <T, R> ConvertConfig(List<Converter<T, R>> converters, GenericConversionService conversionService) {
        converters.forEach(conversionService::addConverter);
    }
}

再次使用

成功!

相关文章
|
Java Spring 容器
Spring中的自定义拓展点
Spring中的自定义拓展点
97 0
|
7月前
|
设计模式 Java Spring
Spring5深入浅出篇:Spring工厂设计模式拓展应用
Spring5深入浅出篇:Spring工厂设计模式拓展应用
|
Java 测试技术 Spring
(八)Spring Boot中对Logback的拓展
目录 一、Logback扩展点介绍 1、为什么不能用logback.xml配置文件呢? 2、扩展点缺点 二、指定Profile配置 三、环境属性
|
XML 人工智能 Java
Spring 5 中文解析核心篇-IoC容器之BeanDefinition继承与容器拓展点
Spring 5 中文解析核心篇-IoC容器之BeanDefinition继承与容器拓展点
302 0
|
XML Java 数据格式
SpringFramework核心技术一(IOC:Spring容器的拓展点)
Spring容器的拓展点 通常,应用程序开发人员不需要ApplicationContext 实现类的子类。相反,Spring IoC容器可以通过插入特殊集成接口的实现来扩展。
1228 0
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
221 2
|
2天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
32 14
|
25天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
42 1
SpringBoot入门(7)- 配置热部署devtools工具
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
43 2
 SpringBoot入门(7)- 配置热部署devtools工具