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

这篇具有很好参考价值的文章主要介绍了在 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 {

    @Override
    public 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;
    }

    @Override
    public 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 {

    @Override
    public 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;
    }

    @Override
    public 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 {

    @Override
    public 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;
    }

    @Override
    public 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 info
        return 5;
    }
}

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

@Mapper(componentModel = "spring")
public abstract class CatMapper {

    @Autowired
    private 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 {

    @Override
    public 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 {

    @Override
    public 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 库的结合可以显着节省开发人员在样板文件上的时间和精力。
感谢您的关注!文章来源地址https://www.toymoban.com/news/detail-632794.html

到了这里,关于在 Spring Boot 应用程序中将 MapStruct 与 Lombok 结合使用的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot应用程序如何配置 HTTPS 访问方式

    在 Spring Boot 应用程序中配置 HTTPS 访问方式可以根据你是否拥有由受信任的证书颁发机构(CA)签发的证书来分为两种情况:使用自签名证书和使用 CA 签发的证书。下面我将分别介绍这两种情况的配置方法: 使用自签名证书 如果你还没有有效的 SSL/TLS 证书,可以选择生成一个

    2024年01月20日
    浏览(46)
  • 快速入门:使用 Spring Boot 构建 Web 应用程序

    本文将讨论以下主题: 安装 Java JDK、Gradle 或 Maven 和 Eclipse 或 IntelliJ IDEA 创建一个新的 Spring Boot 项目 运行 Spring Boot 应用程序 编写一个简单的 Web 应用程序 打包应用程序以用于生产环境 通过这些主题,您将能够开始使用 Spring Boot 并创建自己的 Web 应用程序。 Spring Boot是一个

    2024年02月07日
    浏览(81)
  • 将 Spring Boot 应用程序与 Amazon DocumentDB 集成

    Amazon DocumentDB(与 MongoDB 兼容)是一种可扩展、高度持久和完全托管的数据库服务,用于操作任务关键型 MongoDB 工作负载。在 Amazon DocumentDB 上,您可以使用相同的 MongoDB 应用程序代码、驱动程序和工具来运行、管理和扩展工作负载,无需关心管理底层基础设施。  Spring Boot 提

    2024年02月10日
    浏览(56)
  • 使用Spring Boot和Docker快速部署Java应用程序

    随着微服务的兴起,容器化技术已成为现代应用程序开发和部署的关键部分。Docker作为一种流行的容器化解决方案,广泛应用于企业和开发者社区。与此同时,Spring Boot作为一种优秀的Java开发框架,大大简化了基于Spring的应用程序开发。在本文中,我们将探讨如何将Spring Bo

    2024年02月01日
    浏览(61)
  • 深入探讨Spring Boot:实现一个完整的RESTful应用程序

    在这篇博客中,我们将深入探讨如何使用Spring Boot构建一个完整的RESTful应用程序,数据库选择MySQL。我们将通过实现一个简单的用户管理系统来演示Spring Boot的强大功能。 首先,访问Spring Initializr,选择以下依赖项: Web:用于创建Web应用程序 JPA:用于访问数据库 MySQL:用于连

    2024年02月03日
    浏览(49)
  • “深入理解Spring Boot:构建高效、可扩展的Java应用程序“

    标题:深入理解Spring Boot:构建高效、可扩展的Java应用程序 摘要:Spring Boot是一个用于构建Java应用程序的开源框架,它提供了一种简单且高效的方式来创建独立的、生产级别的应用程序。本文将深入探讨Spring Boot的核心概念和特性,并通过示例代码展示如何使用Spring Boot构建

    2024年02月15日
    浏览(62)
  • “深入了解Spring Boot:构建高效、可扩展的Java应用程序“

    标题:深入了解Spring Boot:构建高效、可扩展的Java应用程序 摘要:Spring Boot是一款快速构建Java应用程序的开发框架,它基于Spring框架,提供了一系列的自动化配置和约定,使得开发者能够更快速、更高效地构建出高质量的应用程序。本文将深入探讨Spring Boot的核心特性和使用

    2024年02月14日
    浏览(57)
  • Spring Boot实践:构建WebSocket实时通信应用程序并创建订阅端点

    作为一款流行的Java开发框架,Spring Boot可以轻松地集成WebSocket。WebSocket能够为Web应用程序提供实时通信功能,而Spring Boot的优秀特性使得它可以很容易地实现WebSocket的集成。在本篇文章中,我们将演示如何使用Spring Boot框架来构建一个简单的WebSocket应用程序。 1. 创建Spring Boo

    2024年02月01日
    浏览(64)
  • “深入理解Spring Boot:构建独立、可扩展的企业级应用程序的最佳实践“

    标题:深入理解Spring Boot:构建独立、可扩展的企业级应用程序的最佳实践 摘要:Spring Boot是一个强大的框架,可以帮助开发人员快速构建独立、可扩展的企业级应用程序。本文将深入探讨Spring Boot的核心概念和最佳实践,并通过示例代码演示其用法。 正文: 什么是Spring Bo

    2024年02月14日
    浏览(63)
  • 性能比较 - Spring Boot 应用程序中的线程池与虚拟线程 (Project Loom)

            本文比较了 Spring Boot 应用程序中的不同请求处理方法:ThreadPool、WebFlux、协程和虚拟线程 (Project Loom)。         在本文中,我们将简要描述并粗略比较可在 Spring Boot 应用程序中使用的各种请求处理方法的性能。         高效的请求处理在开发高性能后端应

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包