如何解决mapstruct和lombok冲突问题

一、冲突如何产生

在按照官网配置mapstruct,使用lombok。当我们在maven install时候会出现属性找不到错误。

如何解决mapstruct和lombok冲突问题_第1张图片

二、解决配置如下

  1. 确保 Lombok 最低版本为 1.18.16
  2. annotationProcessorPaths 中,要配置lombok

        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.8.1
                
                    1.8
                    1.8
                    
                        
                            org.mapstruct
                            mapstruct-processor
                            ${org.mapstruct.version}
                        
                        
                            org.projectlombok
                            lombok
                            1.18.16
                        
                        
                        
                            org.projectlombok
                            lombok-mapstruct-binding
                            0.2.0
                        
                    
                
            
        
    

三、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("[email protected]");
        person.setIdCard("2333");
        person.setAddress("北京市丰台区");
        PersonDto personDto = PersonConver.INSTANCE.converDto(person);
        System.out.println(personDto);
    }

 详细代码地址为:mapstruct

你可能感兴趣的:(java技能提升,java,开发语言,后端)