区别
BeanUtils
使用 spring 的 BeanUtils.copyProperties 来进行 JavaBean 的转换,内部使用的是反射机制,会影响一部分性能。
MapStruct
使用 MapStruct 进行 JavaBean 的转换,MapStruct 使用纯 Java 方法代替 Java 的反射机制快速执行,效率更快。
使用
导包
<org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
编写转换接口
package com.zl.util;
import com.zl.vo.A;
import com.zl.vo.B;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueMappingStrategy;
import org.mapstruct.factory.Mappers;
/**
* Beans处理工具
* @author z
*/
@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
public interface BeansUtil {
BeansUtil INSTANCES = Mappers.getMapper(BeansUtil.class);
/**
* 复制
* @Mapping 用来定义属性复制规则 source 指定源对象属性 target指定目标对象属性
*
* @param source bean源
* @return 目标Bean
*/
@Mappings({
@Mapping(source = "id", target = "userId"),
@Mapping(source = "username", target = "name"),
@Mapping(source = "role.roleName", target = "roleName")
})
B aToB(A source);
/**
* 复制
* @param source bean源
* @param target 目标bean
*/
void toCopyBean(A source,@MappingTarget A target);
}
使用
BeansUtil.INSTANCES.toCopyBean(a,b);
遇到的问题
Couldn’t retrieve @Mapper annotation
1、jar包问题(参考版本 1.3.1.Final)
2、集成swagger2,包冲突
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</exclusion>
</exclusions>
</dependency>