Spring Boot MapStrut内部对象的空策略



我正试图与MapStrut和java两个对象这样的映射:

@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;
}

当状态码为空时,我希望所有eventstatusto对象在EventDTO对象内为空。但是像这样定义映射器:

@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中生成一个空对象eventstatusto。

生成的代码如下:

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;
}

我一直在测试一些nullValueStrategies的mapStruct,但没有…我不想使用@AfterMapping来检查所有空对象

提前感谢。

这是MapStruct不支持的,当试图映射一个嵌套的目标对象时,你无法控制什么会导致bean (EventCauseDTO)成为null

在您的示例中,它看起来非常简单,因为它是一个参数。然而,这很快就会变得复杂。可以有多个参数,任意数量的参数都可能导致目标对象为空或不为空。

我建议在StringEventCauseDTO之间提供一个自定义映射。

@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检查,并且fromCause方法中的EventCauseDTO将返回null

最新更新