我想映射嵌套的java对象。Customer.address.houseNumber
userDTO.homeDTO.addressDTO.houseNo
.
期望:当且仅当Customer.address.houseNumber
不为空时,则在userDTO
下创建homeDTO
对象。否则,不要创建任何目标对象。
问题:我在映射器中使用了"NullValueCheckStrategy.ALWAYS"
,但mapstruct正在检查address
是否不为空,然后创建homeDTO
。在address
内,houseNumber
是null
。我希望空检查直到houseNumber
(叶/最后一个级别对象),然后创建目标对象。
我怎样才能做到这一点?
这是我正在使用的映射。
@Mapper( nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS )
public interface Customer2UserMapper {
@Mapping(source="address.houseNumber", target="homeDTO.addressDTO.houseNo" )
void mapCustomerHouse(Customer customer, @MappingTarget UserDTO userDTO) ;
}
生成的代码 https://github.com/mapstruct/mapstruct/issues/1303
这与mapstruct/mapstruct#879类似。目前,您正在寻找的内容是不可能的。
一种方法是有一个@AfterMapping
的方法,如果address.houseNumber
null
,该方法会将其设置回null
可以使用嵌套映射器执行此操作。 mapCustomerToHouse 映射器将使用 mapHouseNumberToHouseNo 映射器将 houseNumber 映射到 homeDTO,因为它们不是同一类型。 嵌套映射器将检查 houseNo 是否为空,如果是,则不实例化 HomeDTO 对象:
@Mapping(source="address.houseNumber, target="homeDTO" )
void mapCustomerHouse(Customer customer, @MappingTarget UserDTO userDTO) ;
@Mapping(source="houseNumber, target="addressDTO.houseNo" )
HomeDTO mapHouseNumberToHouseNo(Integer houseNumber)