我正在尝试使用 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 是否真的可以开箱即用地进行映射(可变对象),如果是,我在做什么错在上面的代码中?