一、冲突如何产生
在按照官网配置mapstruct,使用lombok。当我们在maven install时候会出现属性找不到错误。
二、解决配置如下
- 确保 Lombok 最低版本为 1.18.16
- annotationProcessorPaths 中,要配置lombok
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
<!-- This is needed when using Lombok 1.18.16 and above -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
三、mapstruct简单例子
MapStruct就是这样的一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。
- 创建两个对象Person 和 PersonDto
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Person {
private String username;
private String address;
private int age;
private String idCard;
private String email;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PersonDto {
private String username;
private String address;
private int age;
private String identityCard;
private String email;
}
- 写一个 Mapper 接口 PersonConverter是单实体映射方法
若源对象属性与目标对象属性名字一致,会自动映射对应属性,不一样的需要指定,也可以用 format 转成自己想要的类型,也支持表达式的方式,可以看到像 name、email等这些名词一致的我并没有指定 source-target,而idCard指定了。
@Mapper
public interface PersonConver {
PersonConver INSTANCE = Mappers.getMapper(PersonConver.class);
@Mapping(source = "idCard",target = "identityCard")
PersonDto converDto(Person person);
}
- 编译MapStruct之后,手工编译或者启动 IDE 的时候 IDE 也会帮我们编译, 会自动target/classes 下生成对应的实现类PersonConverImpl
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2022-01-06T22:05:16+0800",
comments = "version: 1.4.2.Final, compiler: javac, environment: Java 1.8.0_202 (Oracle Corporation)"
)
public class PersonConverImpl implements PersonConver {
@Override
public PersonDto converDto(Person person) {
if ( person == null ) {
return null;
}
PersonDto personDto = new PersonDto();
personDto.setIdentityCard( person.getIdCard() );
personDto.setUsername( person.getUsername() );
personDto.setAddress( person.getAddress() );
personDto.setAge( person.getAge() );
personDto.setEmail( person.getEmail() );
return personDto;
}
}
- 写一个单元测试类 Test 测试一下,看看效果
@org.junit.Test
public void test() {
Person person = new Person();
person.setUsername("张三");
person.setAge(20);
person.setEmail("20003@qq.com");
person.setIdCard("2333");
person.setAddress("北京市丰台区");
PersonDto personDto = PersonConver.INSTANCE.converDto(person);
System.out.println(personDto);
}
详细代码地址为:mapstruct