Lombok和MapStruct整合详情

Lombok和MapStruct是两个非常实用的Java开发工具,其中Lombok可以减少编写代码的麻烦,而MapStruct则可以生成JavaBean之间的映射关系,因此它们在项目中的应用十分广泛。下面将详细讲解Lombok和MapStruct整合的攻略。

Lombok和MapStruct整合:步骤说明

  1. 首先在项目的pom.xml文件中导入Lombok和MapStruct的依赖:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version> <!--当前可用版本-->
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.3.1.Final</version><!--当前可用版本-->
</dependency>
  1. 在需要使用Lombok注解的实体类中,导入各自的注解,例如:
import lombok.Data;//...这一行是必须的
import lombok.NoArgsConstructor;//...这一行根据实际情况决定是否要添加

@Data
@NoArgsConstructor
public class UserEntity {
    private Long id;
    private String name;
    private Integer age;
}
  1. 在需要开启MapStruct的接口中,使用Mapper注解,并编写映射方法,代码示例如下:
@Mapper(componentModel = "spring")
public interface UserConverter {

    UserEntityDto userToUserEntityDto(UserEntity userEntity);

    UserEntity userEntityDtoToUser(UserEntityDto userEntityDto);  
}

其中,@Mapper注解中的componentModel属性决定了映射接口使用的生成实现类的方式,这里指定为spring,则会生成一个UserConverterImpl的实现类。

  1. 编写测试代码,验证整个流程是否可行,如下:
@SpringBootTest
public class UserConverterTest {

    @Autowired
    private UserConverter userConverter;

    @Test
    public void userToUserEntityDto() {
        UserEntity userEntity = new UserEntity();
        userEntity.setId(1L);
        userEntity.setName("Tom");
        userEntity.setAge(18);

        UserEntityDto userEntityDto = userConverter.userToUserEntityDto(userEntity);

        assertEquals(userEntity.getId(), userEntityDto.getId());
        assertEquals(userEntity.getName(), userEntityDto.getName());
        assertEquals(userEntity.getAge(), userEntityDto.getAge());
    }

    @Test
    public void userEntityDtoToUser() {
        UserEntityDto userEntityDto = new UserEntityDto();
        userEntityDto.setId(2L);
        userEntityDto.setName("Jerry");
        userEntityDto.setAge(20);

        UserEntity userEntity = userConverter.userEntityDtoToUser(userEntityDto);

        assertEquals(userEntityDto.getId(), userEntity.getId());
        assertEquals(userEntityDto.getName(), userEntity.getName());
        assertEquals(userEntityDto.getAge(), userEntity.getAge());
    }
}

在上述代码中,使用了断言方法assertEquals来验证映射关系的正确性。

示例

下面以实现用户信息修改为例,实现对于用户对象之间的映射关系。

示例1:修改用户信息

场景描述:需要修改一个已存在的用户信息
- 用户实体对象

@Data
@NoArgsConstructor
public class UserEntity {
    private Long id;
    private String name;
    private Integer age;
}
  • 用户数据传输对象
@Data
@NoArgsConstructor
public class UserDto {
    private Long id;
    private String name;
    private String newPassword;
}
  • 需要映射的用户修改对象
@Data
@NoArgsConstructor
public class UserModify {
    private UserDto userDto;
    private UserEntity userEntity;
}
  • 映射器接口
@Mapper(componentModel = "spring")
public interface UserMapper {
    UserModifyDto toModifyDto(UserEntity userEntity, UserDto userDto);

    UserEntity toUserEntity(UserModifyDto userModifyDto);
}
  • 映射器接口实现
@Component
public class UserMapperImpl implements UserMapper {

    @Override
    public UserModifyDto toModifyDto(UserEntity userEntity, UserDto userDto) {
        if (userEntity == null && userDto == null) {
            return null;
        }
        UserModifyDto target = new UserModifyDto();
        if (userDto != null) {
            target.setUserDto(userDto);
        }
        if (userEntity != null) {
            target.setUserEntity(userEntity);
        }
        return target;
    }

    @Override
    public UserEntity toUserEntity(UserModifyDto userModifyDto) {
        if (userModifyDto == null) {
            return null;
        }
        UserEntity target = new UserEntity();
        UserDto sourceUserDto = userModifyDto.getUserDto();
        UserEntity sourceUserEntity = userModifyDto.getUserEntity();
        if (sourceUserDto != null) {
            BeanUtil.copyProperties(sourceUserDto, target);
        }
        if (sourceUserEntity != null) {
            BeanUtil.copyProperties(sourceUserEntity, target);
        }
        return target;
    }
}
  • 修改用户信息方法
public UserEntity modifyUserInfo(UserModify userModify) {
    UserModifyDto modifyDto = userMapper.toModifyDto(userModify.getUserEntity(), userModify.getUserDto());
    UserEntity userEntity = userMapper.toUserEntity(modifyDto);
    //注入修改时间,然后存入数据库
    userMapper.save(userEntity);      //假设userMapper实现了保存用户信息到数据库的逻辑
    return userEntity;
}

在上述示例中,我们使用了BeanUtil来进行JavaBean之间的属性复制,这个工具类不会自动生成代码,而是在运行时根据当前方法的参数和返回值类型,使用反射机制来完成属性复制的操作。此外,对于复杂的映射,也可以在映射器实现类中使用@Mapping注解和表达式来完成映射操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Lombok和MapStruct整合详情 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java 双指针项目中的实际应用

    背景说明 最近在做财务相关的系统,对账单核销预付款从技术角度来看就是将两个数组进行合并 对账单核销预付款前提条件: 对账单总金额必须等于未核销金额 数据示例 对账单数据 单号 金额 B0001 100 B0002 80 B0003 120 预付款数据 单号 未核销金额 PRE001 110 PRE002 190 结果数据 预付款单号 核销金额 对账单号 PR…

    Java 2023年5月4日
    00
  • Java接口中尽量避免使用数组

    Java接口是一种定义方法签名的语法机制,虽然接口中也可以定义属性,但是定义属性的意义不是很大,因为接口中定义的属性默认都是常量,并且在接口实现类中无法修改。在接口中定义方法时,实现类中必须实现接口中定义的所有方法。在这种情况下,如果接口中使用数组,将会带来一系列问题。接下来,将为大家讲解“Java接口中尽量避免使用数组”的完整攻略。 为什么Java接口中尽…

    Java 2023年5月26日
    00
  • Java获取控制台输入的两种方法小结

    Java获取控制台输入的两种方法小结 引言 在Java编程中,有时候我们需要从控制台获取用户的输入。在本篇文章中,我们将介绍两种方法来实现这个目的。 方法1:使用Scanner类 步骤1:引入Scanner类 我们首先要引入Scanner类,实现代码如下: import java.util.Scanner; 步骤2:创建Scanner对象 接下来,我们需要创…

    Java 2023年5月26日
    00
  • java字符串遍历以及统计字符串中各类字符

    让我来详细讲解一下 Java 字符串遍历以及统计字符串中各类字符的攻略。 什么是字符串 在 Java 中,字符串是一个由零个或多个字符组成的对象。Java 中的字符串类型是 String,可以用来表示文本内容。字符串可用于存储、比较、格式化和输出文本等各种用途。 字符串的遍历 字符串的遍历是指按照顺序依次访问字符串中的每一个字符。Java 中字符串的遍历通常…

    Java 2023年5月26日
    00
  • 解决spring @ControllerAdvice处理异常无法正确匹配自定义异常

    解决Spring @ControllerAdvice处理异常无法正确匹配自定义异常的攻略如下: 1. 检查自定义异常 首先,需要检查自定义异常是否正确地继承了标准的Exception类。如果自定义异常没有正确地继承标准的Exception类,则@ControllerAdvice将无法捕获该自定义异常。确保自定义异常正确继承标准的Exception类可以通过以…

    Java 2023年5月27日
    00
  • Java SE 9 多版本兼容 JAR 包示例

    请看下面的详细讲解。 Java SE 9 多版本兼容 JAR 包示例攻略 在Java SE 9中引入了模块系统,这使得多版本兼容成为了一个挑战。在本篇攻略中,我们将探讨如何创建和使用Java SE 9多版本兼容的JAR包。 创建可兼容的JAR包 在Java SE 9中,为了使一个JAR包能够支持多个版本的Java运行时,我们需要在manifest文件中添加一…

    Java 2023年5月19日
    00
  • 详解Ajax跨域(jsonp) 调用JAVA后台

    为什么要使用 Ajax 跨域? Ajax的默认行为是同域请求,因为浏览器的同源政策限制了浏览器只在同协议、同域名、同端口下的Web服务器间进行信息的交换,如果是异域名请求时就会存在跨域问题。 那么,什么是跨域? 跨域是指访问的域名、协议、端口三者之间任意一个不同,都可以视为跨域。如果是同域请求时,Ajax能够无障碍工作,但如果跨域请求将导致请求中断等错误。跨…

    Java 2023年5月26日
    00
  • Tomcat环境变量如何配置

    Tomcat是一个用于Java应用程序的Web服务器和Servlet容器。在使用Tomcat的过程中,为了保证Web应用程序的正常运行,需要正确地配置Tomcat环境变量。下面是配置Tomcat环境变量的完整攻略: 1. 下载和安装Tomcat 在开始配置Tomcat环境变量之前,我们首先需要下载和安装Tomcat。Tomcat的下载地址为:https://…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部