nullValuePropertyMappingStrategy 不起作用

nullValuePropertyMappingStrategy not working

我有以下映射器

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

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

}

传递给它的 pokerRoomDto 有一个可以为空的“阶段”字段。我希望这个字段在它为空时被忽略。但是现在“null”值仍然映射到 pokerRoom 实体。

如果我只是忽略映射器中的字段,它会起作用,并且 PokerRoom 中阶段的默认值保持不变,但我不想总是忽略它。

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

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

}

这按设计工作。 NullValuePropertyMappingStrategy 仅适用于更新方法。它不用于法线贴图。

我认为您正在寻找 NullValueCheckStrategy,如果您使用 NullValueCheckStrategy#ALWAYS,那么 MapStruct 将始终执行非 PokerRoomDto 的空检查并且仅调用 setter在 PokerRoom 上,如果值不是 null

如果您在声明时初始化您的字段并希望保留该值,我想出了一个解决方案。 有点 hacky,不是很笼统(取决于生成的变量名),但有效。 假设:

class PokerRoom {
    Integer phase = 0;
}

您可以使用

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

一个更简单的解决方案是使用与字段声明相同的常量。

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