在 Spring Boot 应用程序中将 MapStruct 与 Lombok 结合使用的方法

在本文中,您将找到有关如何高效使用 MapStruct、Lombok 和 Spring Boot 的代码示例和说明。

介绍

        当您实现任何规模的服务时,您通常需要将数据从一种结构移动到另一种结构。通常,这是在不同逻辑层使用的相同数据 - 在业务逻辑、数据库级别或用于传输到前端应用程序的控制器级别。

        要传输这些数据,您必须重复大量样板文件。真累。我想提请您注意一个可以帮助您节省精力的图书馆。认识 MapStructure!

使用这个库,您只能指定结构映射方案。其实现将由图书馆自行收集。

在哪里可以找到它

最新版本可以在Maven 中央存储库中找到。
您可以将其添加到您的pom.xml:

<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.5.5.Final</version>
</dependency>

您需要在插件中添加注释处理器:

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.8</source><target>1.8</target><annotationProcessorPaths><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.5.Final</version></path></annotationProcessorPaths></configuration>
</plugin>

如果您使用 Gradle,可以将其添加到您的build.gradle

implementation "org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"

怎么运行的

我们以一些数据类为例:

public class CatEntity {private Long id;private String name;private String color;// getters and setters
}public class CatDto {private Long id;private String name;private String color;// getters and setters
}

这就是我们需要为其实现编写的所有代码:

@Mapper
public interface CatMapper {CatEntity toEntity(CatDto dto);CatDto toDto(CatEntity entity);
}

该接口的实现将由 MapStruct 本身创建:

@Generated
public class CatMapperImpl implements CatMapper {@Overridepublic CatEntity toEntity(CatDto dto) {if ( dto == null ) {return null;}CatEntity catEntity = new CatEntity();catEntity.setId( dto.getId() );catEntity.setName( dto.getName() );catEntity.setColor( dto.getColor() );return catEntity;}@Overridepublic CatDto toDto(CatEntity entity) {if ( entity == null ) {return null;}CatDto catDto = new CatDto();catDto.setId( entity.getId() );catDto.setName( entity.getName() );catDto.setColor( entity.getColor() );return catDto;}
}

如何将 MapStruct 与 Java 记录一起使用

在Java 14中,添加了记录类。MapStruct 也可以处理它们:

public class CatEntity {private Long id;private String name;private String color;// getters and setters
}public record CatRecord(Long id,String name,String color
) {
}

如果我们创建一个映射接口:

@Mapper
public interface CatRecordMapper {CatEntity toEntity(CatRecord record);CatRecord toRecord(CatEntity entity);
}

然后 Mapstruct 将生成如下实现:

@Generated
public class CatRecordMapperImpl implements CatRecordMapper {@Overridepublic CatEntity toEntity(CatRecord record) {if ( record == null ) {return null;}CatEntity catEntity = new CatEntity();catEntity.setId( record.id() );catEntity.setName( record.name() );catEntity.setColor( record.color() );return catEntity;}@Overridepublic CatRecord toRecord(CatEntity entity) {if ( entity == null ) {return null;}Long id = null;String name = null;String color = null;id = entity.getId();name = entity.getName();color = entity.getColor();CatRecord catRecord = new CatRecord( id, name, color );return catRecord;}
}

如何将 MapStruct 与 Project Lombok 结合使用

        在Java世界中,有一个广为人知的大型库——Project Lombok。它还可以减少开发人员必须编写的样板代码。有关该库的更多详细信息,您可以在官方网站上找到。
要将此库添加到您的项目中,您需要将其添加到 pom.xml 中:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>provided</scope>
</dependency>

 而且,您需要将其添加到注释处理器中:

<annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></path>
</annotationProcessorPaths>

对于 Gradle 来说,稍微简单一些。只需将其添加到  build.gradle

implementation 'org.projectlombok:lombok:1.18.28'
annotationProcessor "org.projectlombok:lombok:1.18.28"

并且迈出了重要的一步!要将 Project Lombok 与 MapStruct 集成,您需要添加绑定库:

annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'

对于我们的示例,使用@Data注释就足够了,它添加了 getter 和 setter。

@Data
public class CatDto {private Long id;private String name;private String color;
}@Data
public class CatEntity {private Long id;private String name;private String color;
}

对于同一个mapper接口,它会生成以下实现:

public interface CatMapper {CatEntity toEntity(CatDto dto);CatDto toDto(CatEntity entity);
}@Generated
public class CatMapperImpl implements CatMapper {@Overridepublic CatEntity toEntity(CatDto dto) {if ( dto == null ) {return null;}CatEntity catEntity = new CatEntity();catEntity.setId( dto.getId() );catEntity.setName( dto.getName() );catEntity.setColor( dto.getColor() );return catEntity;}@Overridepublic CatDto toDto(CatEntity entity) {if ( entity == null ) {return null;}CatDto catDto = new CatDto();catDto.setId( entity.getId() );catDto.setName( entity.getName() );catDto.setColor( entity.getColor() );return catDto;}
}

如何将 Spring Boot 逻辑添加到 Mapper 中

有时需要从Spring的bean中检索一些字段。假设我们不在数据库中存储权重信息,这在 Entity 中是无法访问的。相反,我们有一些 Spring 的服务来提供此信息。

@Data
public class CatDto {private Long id;private String name;private String color;private Integer weight;
}@Data
public class CatEntity {private Long id;private String name;private String color;
}
And there is service that provides weight information:@Service
public class CatWeightProvider {public Integer getWeight(String name) {// some logic for retrieving weight inforeturn 5;}
}

要使用此 bean 检索映射器接口内的权重信息,应将其替换为具有描述所有附加逻辑的方法的抽象类。

@Mapper(componentModel = "spring")
public abstract class CatMapper {@Autowiredprivate CatWeightProvider provider;@Mapping(target = "weight", source = "entity.name", qualifiedByName = "retrieveWeight")public abstract CatDto toDto(CatEntity entity);@Named("retrieveWeight")protected Integer retrieveWeight(String name) {return provider.getWeight(name);}
}

在这种情况下,MapStruct将生成这个抽象类的实现:

@Generated
@Component
public class CatMapperImpl extends CatMapper {@Overridepublic CatDto toDto(CatEntity entity) {if ( entity == null ) {return null;}CatDto catDto = new CatDto();catDto.setWeight( retrieveWeight( entity.getName() ) );catDto.setId( entity.getId() );catDto.setName( entity.getName() );catDto.setColor( entity.getColor() );return catDto;}
}

如何忽略字段并映射具有不同名称的字段

例如,数据库实体中的字段和 dto 中的字段具有不同的名称。 

例如,我们需要忽略 dto 层中的字段权重。

@Data
public class CatDto {private String name;private String color;private Integer weight;
}@Data
public class CatEntity {private Long idInDatabase;private String nameInDatabase;private String colorInDatabase;
}

可以通过以下参数来完成:

@Mapper
public interface CatMapper {@Mapping(target = "weight", ignore = true)@Mapping(target = "name", source = "entity.nameInDatabase")@Mapping(target = "color", source = "entity.colorInDatabase")CatDto toDto(CatEntity entity);
}

因此,MapStruct 的实现将是:

@Generated
public class CatMapperImpl implements CatMapper {@Overridepublic CatDto toDto(CatEntity entity) {if ( entity == null ) {return null;}CatDto catDto = new CatDto();catDto.setName( entity.getNameInDatabase() );catDto.setColor( entity.getColorInDatabase() );return catDto;}
}

结论

        我们已经介绍了开发多层应用程序时出现的最流行的场景。因此,Project Lombok 和 MapStruct 库的结合可以显着节省开发人员在样板文件上的时间和精力。
感谢您的关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

perl脚本调用openssh不能正确执行(ctl_dir /root/.libnet-openssh-perl/ is not secure)的原因排查

在使用perl脚本的时候&#xff0c;通过Net::OpenSSH去获取执行节点的信息是一种常用的方法。在某个环境中&#xff0c;执行命令的时候出错&#xff0c;下面展示一下相关的代码 my $ssh_ops {user > "root", password > "password", master_opts >…

【BI系统】选型常见问题解答二

本文主要总结BI系统选型过程中遇见的常见问题&#xff0c;并针对性做出回答&#xff0c;希望能为即将选型&#xff0c;或正在选型BI系统的企业用户们提供一个快速了解通道。 有针对金蝶云星空的BI方案吗&#xff1f;能起到怎样的作用&#xff1f; 答&#xff1a;奥威BI系统拥…

20个Golang自动化DevOps库

探索 20 个用于简化任务和提高生产力的重要库。 Golang&#xff0c;也称为 Go&#xff0c;是一种静态类型、编译型编程语言&#xff0c;由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。它于 2009 年推出&#xff0c;旨在解决其他编程语言的缺点&#xff0c;特…

Nevron Vision for .NET Crack

Nevron Vision for .NET Crack NET Vision是一个用于创建具有数据可视化功能的强大数据表示应用程序的套件。该套件具有用于.NET的Nevron Chart、用于.NET的Nevron Diagram和用于.NET的Nevron User Interface。精心设计的对象模型、众多功能和高质量的演示使复杂数据的可视化变…

【MySQL】

这里写目录标题 MySQL架构一条sql执行流程MySQL数据存放电脑位置ibd文件结构行溢出是什么MySQL行记录存储格式 MySQL架构 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层 Server 层主要负责建立连接、分析和执行 SQL。MySQL 里大多数的核心功能模块都在这实…

后端开发2.mongdb的集成

使用docker安装 安装 拉取镜像 docker pull mongo:4.4.14-focal 创建容器 docker run -itd --name mongo -p 8036:27017 mongo:4.4.14-focal --auth 配置管理员 进入容器 docker exec -it mongo bash 进入终端 mongo 进入admin数据库 use admin 创建管理员账户 db.c…

Pytorch深度学习-----优化器详解(SGD、Adam、RMSprop)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

决策树算法 特征工程-特征提取 特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串&#xff0c;将字符串转换为机器可以读懂的数字特征&#xff0c;才能让计算机理解该字符串(特征)表达的意义。 主要分为&#xff1a;字典特征提取(特征离散化)…

Grafana V10 告警推送 邮件

最近项目建设完成&#xff0c;一个城域网项目&#xff0c;相关zabbix和grafana展示已经完&#xff0c;想了想&#xff0c;不想天天看平台去盯网络监控平台&#xff0c;索性对告警进行分类调整&#xff0c;增加告警的推送&#xff0c;和相关部门的提醒&#xff0c;其他部门看不懂…

嵌入式Linux的学习之初试uboot

背景 在工作中&#xff0c;部门里的嵌入式大屏设备都是安卓开发的。但是安卓系统对硬件要求会高一些&#xff0c;成本也高&#xff0c;部门打算换为Linux系统。遂开始回忆嵌入式Linux系统的开发&#xff0c;并且找了一些教程学习。 找教程的过程真的很艰辛啊&#xff0c;很多开…

http get、post、put

HTTP协议定义了多种请求方法,用于不同的操作。最常见的有 GET、POST 和 PUT。 GET:GET 是最常用的方法,通常用于请求服务器发送某个资源。GET 请求只通过 URL 传送数据,数据信息会附在 URL 之后,以参数的形式附加。由于这种传送方式的限制,GET 请求的数据量较小,且安全性…

Spring Boot开发指南

目录 1. 构建系统 1.1. 依赖管理 1.2. Maven Maven项目结构 1.3. Starter 2. 代码结构 2.1. “default” 包 2.2. 启动类的位置 3. Configuration 类 3.1. 导入额外的 Configuration 类 3.2. 导入 XML Configuration 4. 自动装配&#xff08;配置&#xff09; 4.1…

web集群学习:基于CentOS 7构建 LVS-DR 群集并配置服务启动脚本

目录 1、环境准备 2、配置lvs服务启动脚本 1、在RS上分别配置服务启动脚本 2、在lvs director上配置服务启动脚本 3、客户端测试 配置LVS-DR模式主要注意的有 1、vip绑定在RS的lo接口&#xff1b; 2、RS做arp抑制&#xff1b; 1、环境准备 VIP192.168.95.10 RS1192.168…

Qt应用开发(基础篇)——时间微调输入框QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类&#xff0c;这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件&#xff0c;父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

Android 13 Hotseat定制化修改——005 hotseat图标禁止形成文件夹

目录 一.背景 二.方案 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动…

嘉楠勘智k230开发板上手记录(三)--K230_GPU应用实战

按照K230_GPU应用实战.md 一、开发环境的准备 在src下创建文件夹&#xff0c;并在文件夹中创建Makefile mkdir my_vglite_code cd my_vglite_codeMakefile # SDK地址 K230SDK ? /root/k230/k230_sdk-main # 生成的可执行文件名字 BIN : test-vglite# 指定交叉编译器 CC : …

微信小程序中背景图片如何占满整个屏幕,拉伸

不变形 1. 在页面的wxss文件中&#xff0c;设置背景图片的样式&#xff1a; page{background-image: url(图片路径);background-size: 100% 100%;background-repeat: no-repeat; }2. 在页面的json文件中&#xff0c;设置背景图片的样式&#xff1a; {"backgroundTextStyl…

python-爬虫作业

# -*- coding:utf-8 -*-Author: 董咚咚 contact: 2648633809qq.com Time: 2023/7/31 17:02 version: 1.0import requests import reimport xlwt from bs4 import BeautifulSoupurl "https://www.dygod.net/html/gndy/dyzz/" hd {user-Agent:Mozilla/4.0 (Windows N…

Adaptive AUTOSAR—— Communication Management 3.1

9 Communication Management 9.1 What is Communication Management? 通信管理是自适应平台架构中的一个功能集群。 作为一个功能集群,通信管理向应用程序提供了一个C++ API,实现了面向服务的通信。服务是一个由应用程序提供的功能单元,可以在运行时被另一个应用程序动态…

【新版系统架构补充】-信息系统基础知识

信息系统 信息系统的5个基本功能&#xff1a;输入、存储、处理、输出和控制 信息系统的分类&#xff08;低级到高级&#xff09;&#xff1a;业务&#xff08;数据&#xff09;处理系统&#xff08;TPS/DPS&#xff09;、管理信息系统&#xff08;MIS&#xff09;、决策支持系…