Spring Boot | 集成MapStruct实现不同类型Java对象间的自动转换

简介: MapStruct是一个开源的代码生成器,极大地简化了从一种Java对象到另一种Java对象的转换过程。MapStruct常用注解

MapStruct简介

MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach.
The generated mapping code uses plain method invocations and thus is fast, type-safe and easy to understand.
—— 引自MapStruct官网

MapStruct是一个开源的代码生成器,极大地简化了从一种Java对象到另一种Java对象的转换过程。
MapStruct常用注解

00.png

注解说明@Mapper用于标注Mapper接口,MapStruct根据接口定义自动生成Mapper实现类。@Mapping用于标注接口方法或者参数,指示源属性与目标属性之间的映射关系。可以通过source和target属性指定源和目标属性的名称。@Mappings用于标注多个@Mapping注解,方便在一个接口方法中定义多个属性的映射关系。
@Mapper注解常用属性:

componentModel属性:默认值为default。在Spring项目中通过自动注入的方式使用MapStruct Mapper类,需要将componentModel属性的属性值改为spring。
unmappedTargetPolicy属性:指定目标对象中未映射属性的处理策略。默认为IGNORE,表示忽略未映射的属性。其他可选值包括WARN、ERROR和REPORT。

集成MapStruct
添加MapStruct依赖
修改pom.xml文件,添加如下代码:
...

<java.version>1.8</java.version>
<lombok.version>1.18.24</lombok.version>
<mapstruct.version>1.5.3.Final</mapstruct.version>

...

<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>


<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>



...

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.1</version>
  <configuration>
    <source>${java.version}</source>
    <target>${java.version}</target>
    <annotationProcessorPaths>
      <path>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct.version}</version>
      </path>
      <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
      </path>
      <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok-mapstruct-binding</artifactId>
        <version>0.2.0</version>
      </path>
    </annotationProcessorPaths>
  </configuration>
</plugin>



复制代码
说明:

mapstruct-processor:MapStruct注解处理器。

入门示例:属性完全相同
1、创建一个实体类 —— User.java
package cn.ddcherry.springboot.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {

private String id;
private String usercode;
private String name;

}
复制代码
2、创建一个DTO类 —— UserDto.java
package cn.ddcherry.springboot.demo.dto;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class UserDto {

private String id;
private String usercode;
private String name;

}
复制代码
说明:
实体类和DTO类的属性(类型、名称)完全相同。
3、创建一个转换器类 —— UserMapper.java
package cn.ddcherry.springboot.demo.mapper;

import cn.ddcherry.springboot.demo.dto.UserDto;
import cn.ddcherry.springboot.demo.entity.User;
import org.mapstruct.Mapper;

import java.util.List;

@Mapper(componentModel = "spring")
public interface UserMapper {

UserDto toDto(User entity);
User toEntity(UserDto dto);
List<UserDto> toDto(List<User> entityList);
List<User> toEntity(List<UserDto> dtoList);

}
复制代码
4、创建一个测试类 —— UserMapperTest.java
package cn.ddcherry.springboot.demo;

import cn.ddcherry.springboot.demo.dto.UserDto;
import cn.ddcherry.springboot.demo.entity.User;
import cn.ddcherry.springboot.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class UserMapperTest {

@Resource
private UserMapper userMapper;

@Test
public void testEntityToDto() {
    User user = new User("001", "user-001", "嗨皮汪小成");
    UserDto dto = userMapper.toDto(user);
    System.out.println(dto);
}

}
复制代码
输出结果:
UserDto(id=001, usercode=user-001, name=嗨皮汪小成)
复制代码
程序运行成功后,我们可以在IDEA中打开target目录下的class文件,看一下MapStruct自动生成的转换器实现。笔者汪小成截取了toDto(...)和toDtoList(...)两个方法的实现,如下图:

简单封装
在Spring Boot项目中,我们可以将Entity与DTO间转换的方法提取到一个基础转换器中,其它所有需要进行Entity与DTO转换的类都继承这个类。
基础转换器类 —— BaseMapper.java
package cn.ddcherry.springboot.demo.mapper;

import java.util.List;

public interface BaseMapper<D, E> {

D toDto(E entity);
E toEntity(D dto);
List<D> toDto(List<E> entityList);
List<E> toEntity(List<D> dtoList);

}
复制代码
一个具体转换器类 —— UserMapper.java
package cn.ddcherry.springboot.demo.mapper;

import cn.ddcherry.springboot.demo.dto.UserDto;
import cn.ddcherry.springboot.demo.entity.User;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper extends BaseMapper<UserDto, User> {
}

相关文章
|
6天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
17 1
Spring高手之路24——事务类型及传播行为实战指南
|
11天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
18天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
39 1
Spring 框架:Java 开发者的春天
|
4天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
21 1
|
30天前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
298 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
11天前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
18天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
13天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
14天前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
19 1
|
18天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
46 2