nullValuePropertyMappingStrategy not working

Viewed 2243

I have the following mapper

@Mapper(config = MappingConfig.class)
public interface PokerRoomMapper {

  @Mapping(target = "phase", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
  PokerRoom pokerRoomDtoToPokerRoom(PokerRoomDto pokerRoomDto);

}

The pokerRoomDto which is passed to it has a "phase" field which can be null. I want this field to be ignored when it is null. But right now the "null" value still gets mapped to the pokerRoom entity.

If I just ignore the field in the mapper it works and the default value for phase in PokerRoom stays untouched however I dont want to always ignore it.

@Mapper(config = MappingConfig.class)
public interface PokerRoomMapper {

  @Mapping(target = "phase", ignore = true)
  PokerRoom pokerRoomDtoToPokerRoom(PokerRoomDto pokerRoomDto);

}
2 Answers

This works as designed. NullValuePropertyMappingStrategy is only applied to update method. It is not used for normal mappings.

I think that you are looking for NullValueCheckStrategy, if you use NullValueCheckStrategy#ALWAYS then MapStruct will always do a null check non the PokerRoomDto and only invoke the setter on the PokerRoom if the value was not null

If you initialise your field at declaration and want to keep that value, I've come up with a solution. A bit hacky, not very general (depends on generated variable name), but works. Assuming:

class PokerRoom {
    Integer phase = 0;
}

You can use

@Mapping(target = "phase", defaultExpression = "java( pokerRoom.getPhase() )")
PokerRoom pokerRoomDtoToPokerRoom(PokerRoomDto pokerRoomDto);

A simpler solution would be to use the same constant you use at field declaration.

@Mapping(target = "phase", defaultValue = "0")
PokerRoom pokerRoomDtoToPokerRoom(PokerRoomDto pokerRoomDto);
Related