Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter

场景

开发过程中,会有一些实体转换的需求,有的属性差不多,即使两个实体对象拥有同名

的属性,也需要调用get和set进行取值赋值。比如下面这样:

                longTimeNoLoginList.forEach(busMailList -> {
                    BusDriverNoLoginRecord busDriverNoLoginRecord = new BusDriverNoLoginRecord();
                    busDriverNoLoginRecord.setCarNum(busMailList.getCarNumber());
                    busDriverNoLoginRecord.setNoLoginType(DriverNoLoginTypeEnum.LONGAGOLOGIN.getCode());
                    busDriverNoLoginRecord.setRecordTime(new Date());
                    busDriverNoLoginRecord.setLastLoginNumber(busMailList.getDriverNumber());
                    busDriverNoLoginRecord.setLastLoginTime(null == busMailList.getBindingTime()?busMailList.getUpdateTime():busMailList.getBindingTime());
                });

上面只是两个业务上对象的部分属性需要进行取值赋值操作,更多场景下还有同一个业务模块下VO、DTO、BO、PO、DAO等的转换。

 

MapStruct

MapStruct – Java bean mappings, the easy way!

 

看一下官方的说明,Java bean的映射,更简单的方式。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi 

实现

1、依赖引入

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.2.Final</version>
        </dependency>

2、先看一下官网给出的使用示例

新建Car.java以及CarDto.java

public class Car {
 
    private String make;
    private int numberOfSeats;
    private CarType type;
 
    //constructor, getters, setters etc.
}
public class CarDto {
 
    private String make;
    private int seatCount;
    private String type;
 
    //constructor, getters, setters etc.
}

然后新建转换接口类,并添加@Mapper注解

@Mapper 1
public interface CarMapper {
 
    CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); 3
 
    @Mapping(source = "numberOfSeats", target = "seatCount")
    CarDto carToCarDto(Car car); 2
}

如果需要转换的属性不同命,通过

@Mapping(source = "numberOfSeats", target = "seatCount")

进行映射。

然后测试转换

@Test
public void shouldMapCarToDto() {
    //given
    Car car = new Car( "Morris", 5, CarType.SEDAN );
 
    //when
    CarDto carDto = CarMapper.INSTANCE.carToCarDto( car );
 
    //then
    assertThat( carDto ).isNotNull();
    assertThat( carDto.getMake() ).isEqualTo( "Morris" );
    assertThat( carDto.getSeatCount() ).isEqualTo( 5 );
    assertThat( carDto.getType() ).isEqualTo( "SEDAN" );
}

3、下面在自己的业务中实现

若依前后端分离版本地搭建开发环境并运行项目的教程:

若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_若依前后端分离项目本地运行

在上面搭建框架的基础上并添加依赖后,新建转换接口

import com.ruoyi.common.core.domain.basicinfomanage.BusMailList;
import com.ruoyi.common.core.domain.reportmanagement.BusDriverNoLoginRecord;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DriverNoLoginConvert {
    DriverNoLoginConvert INSTANCE = Mappers.getMapper(DriverNoLoginConvert.class);

    @Mappings({
            @Mapping(source = "carNumber",target = "carNum"),
            @Mapping(source = "driverNumber",target = "lastLoginNumber")
    })
    BusDriverNoLoginRecord mailList2NoLoginRecord(BusMailList busMailList);
}

注意这里引入的Mapper、Mapping、Mappings的包路径。

然后前面两个引入的实体类是需要转换的对象,下面方法中@Mappings代表需要将

BusMailList的carNumber转换到BusDriverNoLoginRecord的carNum以及

BusMailList的driverNumber转换到BusDriverNoLoginRecord的lastLoginNumber

具体需要转换的规则,自己根据业务需求去配置,如果同名会默认进行转换,

这里只配置了两个不同名的属性。

如果同名的属性,但是不需要进行转换的话,比如id属性,可以添加ignore=true来配置

    @Mappings({
            @Mapping(source = "carNumber",target = "carNum"),
            @Mapping(source = "driverNumber",target = "lastLoginNumber"),
            @Mapping(target = "id",ignore = true)
    })

那么上面的具体业务调用就可以修改为

                longTimeNoLoginList.forEach(busMailList -> {
                    BusDriverNoLoginRecord busDriverNoLoginRecord = DriverNoLoginConvert.INSTANCE.mailList2NoLoginRecord(busMailList);
                });

测试之后发现转换成功

 

4、注意事项

如果在引入pom依赖之后,打包时提示

MapStruct - Couldn‘t retrieve @Mapper annotation

 

这是因为与 springfox-swagger2 冲突,该框架里也包含 mapstruct,在swagger2中排除掉

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.fox.version}</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MapStruct 是一个 Java 注解处理器,用于生成类型安全的 Bean 映射代码。它可以自动生成 Bean 映射代码,避免手写大量的重复代码,提高开发效率。 下面我们来演示一下如何使用 MapStruct 进行 Bean 转换。 首先,我们需要在 pom.xml 文件添加 MapStruct 依赖: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.4.2.Final</version> </dependency> ``` 然后,我们需要定义两个 Java Bean 类,例如: ```java public class User { private Long id; private String name; private Integer age; // 省略 gettersetter 方法 } public class UserVO { private Long id; private String username; private Integer age; // 省略 gettersetter 方法 } ``` 接着,我们需要定义一个 MapStruct 接口,用于定义 Bean 映射规则: ```java @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mapping(source = "name", target = "username") UserVO toUserVO(User user); @InheritInverseConfiguration User fromUserVO(UserVO userVO); } ``` 在接口上添加 `@Mapper` 注解,表示这是一个 MapStruct 接口。 接着,我们定义了两个方法,分别用于将 User 转换为 UserVO 和将 UserVO 转换为 User。 在 toUserVO 方法上,使用 `@Mapping` 注解指定了 `name` 属性映射到 `username` 属性上。 在 fromUserVO 方法上,我们使用 `@InheritInverseConfiguration` 注解来继承 toUserVO 方法的映射规则,避免重复编写。 最后,我们可以在代码使用这个 UserMapper 接口来进行 Bean 转换: ```java User user = new User(); user.setId(1L); user.setName("张三"); user.setAge(20); UserVO userVO = UserMapper.INSTANCE.toUserVO(user); System.out.println(userVO.getId()); // 输出 1 System.out.println(userVO.getUsername()); // 输出 "张三" System.out.println(userVO.getAge()); // 输出 20 User user2 = UserMapper.INSTANCE.fromUserVO(userVO); System.out.println(user2.getId()); // 输出 1 System.out.println(user2.getName()); // 输出 "张三" System.out.println(user2.getAge()); // 输出 20 ``` 可以看到,使用 MapStruct 可以非常方便地实现 Bean 转换避免手写大量的重复代码,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道流氓气质

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值