抛弃BeanUtils.copyProperties 转 MapStruct

 

 


前言

MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java bean类型之间的映射的实现。

生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解

官方地址:https://mapstruct.org/

 

一、MapStruct是什么?

MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java bean类型之间的映射的实现。

生成的映射代码使用简单的方法调用,因此速度快,类型安全且易于理解

二、使用步骤

1.POX.XML加入以下配置

代码如下(示例):

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.3.0.Final</version>
</dependency>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source> <!-- depending on your project -->
                <target>1.8</target> <!-- depending on your project -->
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.3.0.Final</version>
                    </path>
                    <!-- other annotation processors -->
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

定义一个映射接口:

@Mapper
public interface PersonMapper {

    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(source = "name",target = "userName")
    PersonDto personDoToPersonDto(PersonDo personDo);
    
}

定义DO

@Data
public class PersonDo {

    private String name;

    private int age;

}

定义DTO

@Data
public class PersonDto {

    private String userName;

    private int age;
    
}

测试方法:

public static void main(String[] args) {
    PersonDo personDo = new PersonDo();
    personDo.setName("王五");
    personDo.setAge(20);

    PersonDto personDto = PersonMapper.INSTANCE.personDoToPersonDto(personDo);
    System.out.println(personDto.getUserName());
}

总结

核心代码在

PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

原理是在其编译时 生成Impl文件,如下源码:

T mapper = classLoader.loadClass(clazz.getName() + "Impl").newInstance();

注意: 

mapstruct整合lombok时会出现一些问题比如:
调用测试方法时候:throw new ClassNotFoundException("Cannot find implementation for " + mapperType.getName());

解决方法:查看目录下是否生成实现类,没有代表冲突编译时错误,最好是先去掉lombok依赖。maven-compiler-plugin 换成3.6.0

项目编译时出现 @Mapping(source = "name",target = "userName")中无name属性,把 mapstruct 版本改成 1.3.0.Final

以上错误可能出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值