内部对象的减震器空策略

ar7v8xwq  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(328)

我要用mapstrout和javaMap两个对象:

@Data
@NoArgsConstructor
public class EventDTO {

  @JsonInclude(Include.NON_NULL)
  private EventStatusDTO eventStatus;
}

@Data
@NoArgsConstructor
public class EventStatusDTO {

  @JsonInclude(Include.NON_NULL)
  private String statusCode;

  @JsonInclude(Include.NON_NULL)
  private String statusDescription;
}

@Data
@NoArgsConstructor
public class Event {
  private String statusCode;
}

当状态代码为null时,我希望eventstatusdto对象中的所有eventstatusdto对象都为null。但是像这样定义Map器:

@Mappings({
    @Mapping(target = "voltageLevel.voltageLevelCode", source = "voltageLevelCode"),
    @Mapping(target = "eventStatus.statusCode", source = "statusCode", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL),
    @Mapping(target = "eventType.typeCode", source = "typeCode", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL),
    @Mapping(target = "eventCause.causeCode", source = "causeCode", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL)
  })
  public abstract EventDTO fromEntityToDTO(Event source);

我只能在eventdto中生成一个空对象eventstatusdto。
这是生成的代码:

protected EventCauseDTO eventToEventCauseDTO(Event event) {
        if ( event == null ) {
            return null;
        }

        EventCauseDTO eventCauseDTO = new EventCauseDTO();

        eventCauseDTO.setCauseCode( event.getCauseCode() );

        return eventCauseDTO;
    }

我能让这更像谁

protected EventCauseDTO eventToEventCauseDTO(Event event) {
        if ( event == null ) {
            return null;
        }

        EventCauseDTO eventCauseDTO = null;

        if(event.getCauseCode() != null) {
            eventCauseDTO = new EventCauseDTO();
            eventCauseDTO.setCauseCode(event.getCauseCode());
        }

        return eventCauseDTO;
    }

我一直在用mapstruct的一些nullvaluestrategies进行测试,但是什么都没有。。。我不想用@aftermapping检查所有空对象。
提前谢谢。

1hdlvixo

1hdlvixo1#

mapstruct不支持这一点,当尝试Map嵌套的目标对象时,您无法控制导致该bean的原因( EventCauseDTO )成为 null .
在您的示例中,它看起来非常简单,因为它是单个参数。然而,这会很快变得复杂。可能有多个参数,任意数量的参数都可能导致目标对象为空或不为空。
我的建议是在 String 以及 EventCauseDTO .
例如

@Mapper
public interface EventMapper {

    @Mapping(target = "voltageLevel.voltageLevelCode", source = "voltageLevelCode"),
    @Mapping(target = "eventStatus.statusCode", source = "statusCode")
    @Mapping(target = "eventType.typeCode", source = "typeCode")
    @Mapping(target = "eventCause", source = "causeCode")
    EventDTO fromEntityToDTO(Event source);

    @Mapping( target = "causeCode", source = "cause")
    EventCauseDTO fromCause(String cause);

}

如果你这样做了,那么会有一个 null 检查源参数和 null 将被退回 EventCauseDTOfromCause 方法。

相关问题