我要用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检查所有空对象。
提前谢谢。
1条答案
按热度按时间1hdlvixo1#
mapstruct不支持这一点,当尝试Map嵌套的目标对象时,您无法控制导致该bean的原因(
EventCauseDTO
)成为null
.在您的示例中,它看起来非常简单,因为它是单个参数。然而,这会很快变得复杂。可能有多个参数,任意数量的参数都可能导致目标对象为空或不为空。
我的建议是在
String
以及EventCauseDTO
.例如
如果你这样做了,那么会有一个
null
检查源参数和null
将被退回EventCauseDTO
在fromCause
方法。