Spring 为内部对象启动 MapStrut 空策略
Spring Boot MapStrut null strategy for internal object
我正在尝试使用 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;
}
当状态代码为空时,我希望 EventDTO 对象内的所有 EventStatusDTO 对象都为空。但是像这样定义映射器:
@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 来检查所有空对象。
提前致谢。
MapStruct 不支持此功能,当尝试映射嵌套目标对象时,您无法控制导致该 bean (EventCauseDTO
) 成为 null
.
的原因
在您的示例中,它看起来非常简单,因为它是一个参数。然而,这会很快变得复杂。可以有多个参数,任意数量的参数都可能导致目标对象为 null 或不为 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
将为 fromCause
方法中的 EventCauseDTO
返回。
我正在尝试使用 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;
}
当状态代码为空时,我希望 EventDTO 对象内的所有 EventStatusDTO 对象都为空。但是像这样定义映射器:
@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 来检查所有空对象。
提前致谢。
MapStruct 不支持此功能,当尝试映射嵌套目标对象时,您无法控制导致该 bean (EventCauseDTO
) 成为 null
.
在您的示例中,它看起来非常简单,因为它是一个参数。然而,这会很快变得复杂。可以有多个参数,任意数量的参数都可能导致目标对象为 null 或不为 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
将为 fromCause
方法中的 EventCauseDTO
返回。