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

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

场景

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

的属性,也需要调用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等的转换。

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

 

MapStruct

MapStruct – Java bean mappings, the easy way!

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

 

看一下官方的说明,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);
                });

测试之后发现转换成功

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

 

4、注意事项

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

MapStruct – Couldn‘t retrieve @Mapper annotation

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

 

这是因为与 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>

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135828.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!