MapStruct之@Mapper注解的用法


大家好,我是 @明人只说暗话 ,今天为大家介绍一下JavaBean映射工具MapStruct的@Mapper注解的常用属性,水平一般,能力有限,若有错误之处,欢迎指正。
作用
将接口或抽象类标记为映射器,并通过MapStruct为这个接口或者抽象类生成一个实现类。
下面详细介绍一下@Mapper注解的常用属性。
uses属性
指定使用的其他映射器,可以指定多个。
上图红框中,IStudentListConvert映射器就使用了IStudentConvert映射器。
componentModel属性
指定生成的映射器应遵循的组件模型,取值有:default、cdi、spring、jsr330和jakarta。说人话就是——在生成了类上会加上相应的注解。
spring
当我们在接口或者抽象类上指定componentModel的属性值是spring的时候,如下图所示。
重新编译之后!!!一定要重新编译!!!
生成的类上会加上@Component注解,如下图所示,这样我们可以在其他地方通过@Resource等注解引入这个类了。
jsr330
当我们在接口或者抽象类上指定componentModel的属性值是jsr330的时候(需要引入javax.inject依赖),实现类上添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取。
结果如下图所示。
其他属性,可以自行验证。
implementationName属性
本属性可以指定实现类的类名。
默认情况下,实现类的类名为接口或者抽象类的名字加上Impl。例如,接口名是IStudentConvert,则实现类名是IStudentConvertImpl。
如果我们指定了实现类的名字,则编译后生成的class文件,就是这个文件,如下图。
implementationPackage属性
本属性可以指定实现类的所在的包名。
默认情况下,实现类和接口或者抽象类在同一个包下,如上图所示。
但是,我们也可以指定具体的包名,如下图所示。
nullValueCheckStrategy属性
是否在生成的实现类中,对每一个属性进行null检查,可选值有两个:ON_IMPLICIT_CONVERSION(默认值)和 ALWAYS 。
ALWAYS
ALWAYS 表示在赋值之前,对每一个属性进行!= null的检查。
ON_IMPLICIT_CONVERSION
ON_IMPLICIT_CONVERSION则表示直接进行赋值,不进行 != null 判断。
nullValuePropertyMappingStrategy属性
指定当源属性为null或者不存在时的策略,可选值有:
SET_TO_NULL(默认值)
SET_TO_DEFAULT
根据源属性的类型,设置指定的默认值。
源属性是List,则默认值是ArrayList;
源属性是String,则默认值是"";源属性是基本类型,则默认值是0或者false;
源属性是Map,则默认值是LinkedHashMap;
源属性是数组,则默认值是空数组。
Order.java代码如下。
package com.ylz.mapstruct.domain.entity;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class Order {
private List<String> itemIdList;
private String orderType;
private int itemCount;
private boolean validFlag;
private Map<String, String> map;
private String[] arr;
OrderDTO.java代码如下。
package com.ylz.mapstruct.domain.dto;
import lombok.Data;
import org.mapstruct.Mapper;
import java.util.List;
import java.util.Map;
@Data
@Mapper
public class OrderDTO {
private List<String> itemIdList;
private String orderType;
private int itemCount;
private boolean validFlag;
private Map<String, String> map;
private String[] arr;
IOrderConvert.java代码如下。
package com.ylz.mapstruct.domain.convert;
import com.ylz.mapstruct.domain.dto.OrderDTO;
import com.ylz.mapstruct.domain.entity.Order;
import org.mapstruct.Mapper;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.factory.Mappers;
@Mapper(implementationName = "OrderConvertUtil",
implementationPackage = "com.ylz.mapstruct.domain.convert.impl",
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_DEFAULT)
public interface IOrderConvert {
IOrderConvert INSTANCE = Mappers.getMapper(IOrderConvert.class);
OrderDTO order2OrderDTO(Order order);
}
IOrderConvert.java实现类OrderConvertUtil的代码如下。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
package com.ylz.mapstruct.domain.convert.impl;
import com.ylz.mapstruct.domain.convert.IOrderConvert;
import com.ylz.mapstruct.domain.dto.OrderDTO;
import com.ylz.mapstruct.domain.entity.Order;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class OrderConvertUtil implements IOrderConvert {
public OrderConvertUtil() {
public OrderDTO order2OrderDTO(Order order) {
if (order == null) {
return null;
} else {
OrderDTO orderDTO = new OrderDTO();
List<String> list = order.getItemIdList();
if (list != null) {
orderDTO.setItemIdList(new ArrayList(list));
orderDTO.setOrderType(order.getOrderType());
orderDTO.setItemCount(order.getItemCount());
orderDTO.setValidFlag(order.isValidFlag());
Map<String, String> map = order.getMap();
if (map != null) {
orderDTO.setMap(new LinkedHashMap(map));
String[] arr = order.getArr();
if (arr != null) {
orderDTO.setArr((String[])Arrays.copyOf(arr, arr.length));