我正在尝试使用 mapstruct 1.2.0 映射嵌套属性.CR2。(示例映射 customer.address.houseNumber to userDTO.homeDTO.addressDTO.houseNo )。
期望 : 当客户地址为空时,我不想将地址DTO设置为空。 由于地址DTO包含"县名"和其他属性,这些属性已经从其他不同的来源设置。
请告知是否有我可以设置的属性/设置,以便在源为空时目标不设置为 null。
@Mapper( nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS )
public interface CustomerUserMapperNullCheck {
@Mapping(source="address", target="homeDTO.addressDTO" )
void mapCustomer(Customer customer, @MappingTarget UserDTO userDTO) ;
@Mapping(source="houseNumber", target="houseNo" )
void mapCustomerHouse(Address address, @MappingTarget AddressDTO addrDTO) ;
}
我最初尝试使用如下所示的单个映射
@Mapping(target="homeDTO.addressDTO.houseNo", source="address.houseNumber")
abstract void mapCustomerHouse(Customer customer, @MappingTarget UserDTO userDTO) ;
然后尝试根据 https://github.com/mapstruct/mapstruct/issues/649 拆分映射。
两种方法都没有产生预期的结果/生成的方法代码
protected void customerToHomeDTO(Customer customer, HomeDTO mappingTarget) {
if ( customer == null ) {
return;
}
if ( customer.getAddress() != null ) {
if ( mappingTarget.getAddressDTO() == null ) {
mappingTarget.setAddressDTO( new AddressDTO() );
}
mapCustomerHouse( customer.getAddress(), mappingTarget.getAddressDTO() );
}
**else {
mappingTarget.setAddressDTO( null ); // I dont want to else where addressDTO is set to null.
}**
}
完整的生成代码在这里
https://github.com/mapstruct/mapstruct/issues/1306
谢谢
@Mapper( nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE )
它的工作原理是这样的:
@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
public interface MyMapper {
...
}
只有这个有效,如下所述: https://github.com/mapstruct/mapstruct/issues/649
@Mapper( nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS )
这对我有用:
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void updateProduct(@MappingTarget Product entity, ProductRequestDto dto);
@Mapping注释需要当前(1.5.5.Final)MapStruct版本中的"目标"选项。
感谢您在 github 讨论@tak3shi链接!