0

我正在尝试使用 Mapstruct 和 Lombok 进行一些嵌套映射。根据他们的最新规范,mapstruct 1.2 与 Lombok 一起开箱即用。

这是我的代码:

源类

@Builder
@Getter
@Setter
public class PojoA {
   private String stringA;
   private int integer;
   private PojoB pojoB;
}

@Builder
@Getter
@Setter
public class PojoB {
    private long aLong;
    private String string;
    private PojoC pojoC;
}

@Builder
@Getter
@Setter
public class PojoC {
    private int value;
}

目标类

@Setter
@Getter
@ToString
public class Target {
    private String targetString;
    private int integer;
    private TargetPrime targetPrime;
}

@ToString
@Getter
@Setter
public class TargetPrime {
    private long aLong;
    private String string;
    private TargetPrimePrime targetPrimePrime;
}

@ToString
@Getter
@Setter
public class TargetPrimePrime {
    private int value;
}

映射器

@Mapper
public interface PojoMapper {

    PojoMapper INSTANCE = Mappers.getMapper(PojoMapper.class);

    @Mapping(source = "stringA", target = "targetString")
    @Mapping(source = "pojoB", target = "targetPrime")
    Target pojoAToTarget(PojoA pojoA);

    TargetPrimePrime map(PojoC pojoC);

    @Mapping(source = "pojoC", target = "targetPrimePrime")
    TargetPrime mapToPrime(PojoB pojoB);
}

正如所写的那样,MapStruct 现在可以开箱即用地与 Lombok 一起使用,这意味着映射代码应该可以工作。但相反,它给了我一个编译错误“它找不到 setter setTargetPrime”。

但令人惊讶的是,如果我只为 targetPrime 添加 getter/setter 并保持原样,那么它在 Lombok 上工作得很好。

例如。

更新的目标

@Setter
@Getter
@ToString
public class Target {
    private String targetString;
    private int integer;
    private TargetPrime targetPrime;

    public TargetPrime getTargetPrime() {
        return targetPrime;
    }

    public void setTargetPrime(TargetPrime targetPrime) {
        this.targetPrime = targetPrime;
    }
}

然后运行这个

PojoC pojoC = PojoC.builder().value(12345).build();
        PojoB pojoB = PojoB.builder().aLong(15).string("AutoScanned").pojoC(pojoC).build();
        PojoA pojoA = PojoA.builder().integer(10).stringA("Testing").pojoB(pojoB).build();
        Target target = PojoMapper.INSTANCE.pojoAToTarget(pojoA);
        System.out.println(target);

我将获得所有映射的成功输出。

输出

Target(targetString=Testing, integer=10, targetPrime=TargetPrime(aLong=15, string=AutoScanned, targetPrimePrime=TargetPrime(value=12345)))

因此,由于我的团队非常喜欢 Lombok,因此我无法从我正在从事的所有项目中删除 Lombok,因此 Lombok 是否真的可以开箱即用地进行映射(可变对象),如果是,我在做什么错在上面的代码中?

4

0 回答 0