1. 问题复现
代码里使用了如下组件:
- lombok 1.18.20
- mapstruct 1.4.2.Final
复现问题相关的类:
@Getter
@Setter(AccessLevel.PROTECTED)
@SuperBuilder
public class OrderItem extends IdEntity<BigInteger> {
private ProductVO product;
private Integer number;
}
@Getter
@Setter(AccessLevel.PROTECTED)
@Builder
@AllArgsConstructor
public class ProductVO {
private Long id;
private BigDecimal unitPrice;
private String name;
}
@Getter
@Setter
@Entity
@Table(name = "t_order_item")
@EntityListeners(PersistIdListener.class)
public class OrderItemDO extends IdDO<Long> {
private Long order;
private Long product;
private BigDecimal productUnitPrice;
private String productName;
private Integer productNumber;
}
Mapstruct Mapper:
@Mapper
public abstract class OrderDOConverter {
public static final OrderDOConverter MAPPER = Mappers.getMapper(OrderDOConverter.class);
@Mapping(source = "orderItem.product.id", target = "product")
@Mapping(source = "orderItem.product.name", target = "productName")
@Mapping(source = "orderItem.product.unitPrice", target = "productUnitPrice")
@Mapping(source = "orderItem.number", target = "productNumber")
protected abstract OrderItemDO toOrderItemDO(OrderItem orderItem);
编译代码,提示错误:Unknown property。
2. 问题原因与解决方案
经过分析,问题原因是lombok和mapstruct的processor写反了,导致mapstruct在编译过程中处理字节码时,lombok的processor还未进行字节码处理,从而无法找到POJO中属性的get方法。
错误的依赖配置方法如下(使用gradle配置依赖):
dependencies {
implementation("org.mapstruct:mapstruct")
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.mapstruct:mapstruct-processor:${mapstruct_processor_version}")
annotationProcessor("org.projectlombok:lombok")
}
正确在配置方法是:
dependencies {
implementation("org.mapstruct:mapstruct")
compileOnly("org.projectlombok:lombok")
// 调整lombok和mapstruct的processor顺序
annotationProcessor("org.projectlombok:lombok")
annotationProcessor("org.mapstruct:mapstruct-processor:${mapstruct_processor_version}")
}