如何解决mapstruct和lombok冲突问题
一、冲突如何产生
在按照官网配置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 测试一下,看看效果
详细代码地址为:
下一篇:
程序猿入门攻略(十一)——结构体