相关文章推荐
强悍的书签  ·  dockerfile cmd 不生效-掘金·  1 年前    · 
力能扛鼎的生姜  ·  FFmpeg server ...·  1 年前    · 
开朗的滑板  ·  error converting YAML ...·  1 年前    · 
强健的蛋挞  ·  独家 | ...·  2 年前    · 
MapStruct之@Mapper注解的用法

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));