Я искал решение во всем Интернете, но не смог найти работающее для меня.
Я хочу сопоставить следующий класс
Класс Cartype:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"Make",
"Model"
})
public class CarType {
@JsonProperty("Make")
private String make;
@JsonProperty("Model")
private String model;
@JsonProperty("VIN")
private String vin;
(... getter/setter ...)
... to ...
@ApiModel(description = "FleetContractDto")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class FleetContractDto implements Serializable {
(... other attributes ...)
@ApiModelProperty(value = "Type of the car (generated)",
example = "BMW i3")
private String carType = null;
(... getter/setter ...)
Контейнер для класса CarType:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"Count",
"Results"
})
public class CarTypeContainer {
@JsonProperty("Count")
private Integer count;
@JsonProperty("Results")
private List results = null;
(... getter/setter ...)
Контейнер для FleetContractDto:
@ApiModel(description = "FleetContainer")
public class FleetContainer implements Serializable {
@SerializedName("data")
private List data = new ArrayList();
(... getter / setter ...)
Я пробовал много решений, таких как TypeToken
List fleetContracts = mappingRepo.getModelMapper().map(carTypes.getResults(), new TypeToken>() {}.getType());
, но проблема в том, что у меня уже есть список с объектами (и значениями там), и я не хочу иметь новыйone.
Итак, я написал два класса отображения для ModelMapper:
Контейнер в контейнер:
public class CarTypeContainerToFleetContainer extends PropertyMap {
private static final Converter, List> carTypeConverter = ctx -> {
return ctx.getSource().stream().map(carType -> {
MappingContext subContext = ctx.create(carType, FleetContractDto.class);
return ctx.getMappingEngine().map(subContext);
}).collect(Collectors.toList());
};
@Override
protected void configure() {
using(carTypeConverter).map(source.getResults()).setData(null);
}
}
CarType для FleetContractDto:
public class CarTypeToFleetContractDto extends PropertyMap {
private static final Converter carTypeConverter = ctx -> {
return ctx.getSource().getMake() + " " + ctx.getSource().getModel();
};
@Override
protected void configure() {
using(carTypeConverter).map().setCarType(null);
}
}
Они также добавлены и будут найдены Spring:
this.modelMapper.addMappings(new CarTypeContainerToFleetContainer());
this.modelMapper.addMappings(new CarTypeToFleetContractDto());
Проблема в том, что если я пытаюсь вызвать CarTypeToFleetContractDto-Mapper из CarTypeContainerToFleetContainer-Mapper, я получу следующую ошибку:
ModelMapper mapping errors:\r\n\r\n1) Converter (...).dto.mapper.fleet.CarTypeToFleetContractDto$$Lambda$44/1246567323@43de4d77 failed to convert java.lang.Object to java.lang.String.\r\nCaused by: java.lang.NullPointerException\r\n\tat (...).dto.mapper.fleet.CarTypeToFleetContractDto.lambda$static$0(CarTypeToFleetContractDto.java:11)\r\n\tat org.modelmapper.internal.MappingEngineImpl.convert(MappingEngineImpl.java:302)\r\n\tat org.modelmapper.internal.MappingEngineImpl.setDestinationValue(MappingEngineImpl.java:239)\r\n\tat org.modelmapper.internal.MappingEngineImpl.propertyMap(MappingEngineImpl.java:187)\r\n\tat org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:151)\r\n\tat org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:105)
У меня больше нет идей, что я еще могу попробовать.Единственное, что я хочу сделать, это сопоставить значения из списка с CarTypes с уже существующим списком с FleetContractDtos.
Было бы очень хорошо, если бы кто-то мог мне помочь.