Map struct:当源为空时,目标不应设置为null。

17

我正在尝试使用mapstruct 1.2.0.CR2映射嵌套属性。 (例如,将customer.address.houseNumber映射到userDTO.homeDTO.addressDTO.houseNo)。

期望:当customer.address为null时,我不想将addressDTO设置为null。因为addressDTO包含“countyname”和其他已从其他不同来源设置的属性。

请建议是否有可设置的属性/设置,以便在源为null时不设置目标为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

谢谢

链接问题中的答案是否解决了您的问题? - Filip
对我来说,它按照问题/疑问中提供的链接所述正常工作。 - mindOf_L
5个回答

32
@Mapper( nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE )

4

3
对我来说,它是这样运作的:
@Mapper(nullValueMappingStrategy =  NullValueMappingStrategy.RETURN_DEFAULT)
public interface MyMapper {
...
}

1
这对我有用:
@BeanMapping(nullValuePropertyMappingStrategy =  NullValuePropertyMappingStrategy.IGNORE)
void updateProduct(@MappingTarget Product entity, ProductRequestDto dto);

@Mapping注解在当前(1.5.5.Final)的MapStruct版本中需要"target"选项。
感谢@tak3shi在GitHub讨论中提供的链接!

通过添加MappingTarget注解以及BeanMapping(nullValuePropertyMappingStrategy)为我解决了问题。似乎在没有MappingTarget映射器实现的情况下,会生成但忽略nullValuePropertyMappingStrategy。 - Artur Łysik

0
我正在使用Mapstruct 1.5.5.Final。
您可以在映射器级别使用NullValuePropertyMappingStrategy.IGNORE来影响所有的映射方法:
    @Mapper(
        nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE
    )
    public interface MyMapper {..}

如果你只想覆盖单个值的映射,你可以在映射级别使用NullValuePropertyMappingStrategy.IGNORE,并定义一个自定义的映射方法:
    @Mappings({
        @Mapping(target = "json", source = "json", 
                 qualifiedByName = "jsonCustomMapper", 
                 nullValueCheckStrategy = NullValueCheckStrategy.ON_IMPLICIT_CONVERSION)
    })
    Target target(Source source);
    
    ...

    @Named("jsonCustomMapper")
    default String jsonCustomMapper(String json) {
        // Define empty json for null or empty json string
        return (json == null || json.trim().isEmpty()) ? "{}" :json;
    }


请注意,ON_IMPLICIT_CONVERSION 不会影响自定义映射方法。 https://mapstruct.org/documentation/stable/api/org/mapstruct/NullValueCheckStrategy.html#ON_IMPLICIT_CONVERSION 希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接