MapStruct 隐式类型转换

MapStruct 在大多数情况下会自动处理类型转换。 例如,int 到 Long 或 String 的转换。 转换也处理空值。 以下是一些重要的自动转换。

  • 在原始类型和相应的包装类之间。
  • 在原始类型和字符串之间。
  • 在枚举类型和字符串之间。
  • 在 BigInt、BigDecimal 和 String 之间。
  • 在日历/日期和 XMLGregorianCalendar 之间。
  • XMLGregorianCalendar 和字符串之间。
  • 在 Jodas 日期类型和字符串之间。

示例

打开使用 Builder 映射章节中更新的项目映射。

使用以下代码更新 StudentEntity.java

StudentEntity.java

package com.jiyik.entity;

public class StudentEntity {
    private String id;
    private String name;
    private String classVal;
    private SubjectEntity subject;
    public String section;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getClassVal() {
        return classVal;
    }
    public void setClassVal(String classVal) {
        this.classVal = classVal;
    }
    public SubjectEntity getSubject() {
        return subject;
    }
    public void setSubject(SubjectEntity subject) {
        this.subject = subject;
    }
}

Student.java 不变,代码如下

Student.java

package com.jiyik.model;

public class Student {
    private final String name;
    private final int id;

    protected Student(Student.Builder builder) {
        this.name = builder.name;
        this.id = builder.id;
    }
    public static Student.Builder builder() {
        return new Student.Builder();
    }
    public static class Builder {
        private String name;
        private int id;

        public Builder name(String name) {
            this.name = name;
            return this;
        }
        public Builder id(int id) {
            this.id = id;
            return this;
        }
        public Student create() {
            return new Student( this );
        }
    }
    public String getName() {
        return name;
    }
    public int getId() {
        return id;
    }
}

使用以下代码更新 DeliveryAddressMapperTest.java

DeliveryAddressMapperTest.java

import com.jiyik.entity.AddressEntity;
import com.jiyik.entity.StudentEntity;
import com.jiyik.mapper.DeliveryAddressMapper;
import com.jiyik.model.DeliveryAddress;
import org.junit.Test;
import org.mapstruct.factory.Mappers;

import static org.junit.Assert.assertEquals;

public class DeliveryAddressMapperTest {
    private DeliveryAddressMapper deliveryAddressMapper = Mappers.getMapper(DeliveryAddressMapper.class);

    @Test
    public void testEntityToModel() {
        StudentEntity student = new StudentEntity();
        student.setClassVal("X");
        student.setName("John");
        student.setId("1");

        AddressEntity address = new AddressEntity();
        address.setCity("Y");
        address.setState("Z");
        address.setHouseNo(1);

        DeliveryAddress deliveryAddress = deliveryAddressMapper.getDeliveryAddress(student, address);

        assertEquals(deliveryAddress.getName(), student.getName());
        assertEquals(deliveryAddress.getCity(), address.getCity());
        assertEquals(deliveryAddress.getState(), address.getState());
        assertEquals(deliveryAddress.getHouseNumber(), address.getHouseNo());
    }
}

使用以下代码更新 StudentMapperTest.java

StudentMapperTest.java

import com.jiyik.entity.StudentEntity;
import com.jiyik.mapper.StudentMapper;
import com.jiyik.model.Student;
import org.junit.Test;
import org.mapstruct.factory.Mappers;

import static org.junit.Assert.assertEquals;

public class StudentMapperTest {
    private StudentMapper studentMapper = Mappers.getMapper(StudentMapper.class);

    @Test
    public void testEntityToModel() {
        StudentEntity entity = new StudentEntity();
        entity.setName("John");
        entity.setId("1");

        Student model = studentMapper.getModelFromEntity(entity);
        assertEquals(entity.getName(), model.getName());
        assertEquals(Integer.parseInt(entity.getId()), model.getId());
    }
    @Test
    public void testModelToEntity() {
        Student.Builder builder = Student.builder().id(1).name("John");
        Student model = builder.create();
        StudentEntity entity = studentMapper.getEntityFromModel(model);

        assertEquals(entity.getName(), model.getName());
        assertEquals(Integer.parseInt(entity.getId()), model.getId());
    }
}

运行以下命令来测试映射。

$ mvn clean test

执行结果如下

mapstruct 映射多对象

查看笔记

扫码一下
查看教程更方便