ModelMapper: сопоставить список объектов (со связанной строкой) с другим списком объектов
Я искал решение по всему интернету, но не смог найти работающего для меня.
Я хочу отобразить следующий класс
Класс Cartype:
@JsonInclude (JsonInclude.Include.NON_NULL) @JsonPropertyOrder ({ "Делать", "Модель" }) открытый класс CarType { @JsonProperty("Make") частная строка делает; @JsonProperty("Модель") частная модель String; @JsonProperty("VIN") частная строка вин; (... получатель / установщик...)
... чтобы...
@ApiModel (description = "FleetContractDto") @JsonInclude (JsonInclude.Include.NON_NULL) открытый класс FleetContractDto реализует Serializable { (... другие атрибуты...) @ApiModelProperty(value = "Тип автомобиля (сгенерированный)", пример = "BMW i3") private String carType = null; (... получатель / установщик...)
Контейнер для класса CarType:
@JsonInclude (JsonInclude.Include.NON_NULL) @JsonPropertyOrder ({ "Граф", "Результаты" }) открытый класс CarTypeContainer { @JsonProperty("Count") частное целое число; @JsonProperty("Итоги") приватный список результатов = ноль; (... получатель / установщик...)
Контейнер для FleetContractDto:
@ApiModel (description = "FleetContainer") открытый класс FleetContainer реализует Serializable { @SerializedName("данные") закрытый список данных = новый ArrayList(); (... получатель / установщик...)
Я пробовал много решений, таких как TypeToken
Список fleetContracts = mappingRepo.getModelMapper(). Map(carTypes.getResults(), new TypeToken>() {}.getType());
но проблема в том, что у меня есть уже существующий список с объектами (и значениями там), и я не хочу иметь новый.
Итак, я написал два класса отображения для ModelMapper:
Контейнер в контейнер:
открытый класс CarTypeContainerToFleetContainer extends PropertyMap {частный статический конечный конвертер, List> carTypeConverter = ctx -> { return ctx.getSource().stream().map(carType -> { MappingContext subContext = ctx.create(carType, FleetconttoD); return ctx.getMappingEngine().map(subContext); }).collect(Collectors.toList()); }; @Override protected void configure() { using(carTypeConverter).map(source.getResults()). SetData (null); } }
CarType to FleetContractDto:
открытый класс CarTypeToFleetContractDto extends PropertyMap { приватный статический финальный конвертер carTypeConverter = ctx -> { return ctx.getSource().getMake() + " " + ctx.getSource().getModel(); }; @Override защищенный void configure () { используя (carTypeConverter).map () setCarType (нуль). } }
Там же добавлены и будут найдены Spring:
this.modelMapper.addMappings (new CarTypeContainerToFleetContainer ()); this.modelMapper.addMappings (new CarTypeToFleetContractDto ());
Проблема в том, что если я пытаюсь вызвать CarTypeToFleetContractDto-Mapper из CarTypeContainerToFleetContainer-Mapper, я получу следующую ошибку:
Ошибки отображения ModelMapper:\r\n\r\n1) Converter (...). Dto.mapper.fleet.CarTypeToFleetContractDto$$Lambda$44/1246567323@43de4d77 не удалось преобразовать java.lang.Object в java.lang.String.\r\n Причиняется: 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. propertyMap(MappingEngineImpl.java:187)\r\n\tat org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:151)\r\n\tat org.modelmapper.internal.MappingEngineImpl.jj: Map (MappingEngineImpl.jpg: Mapping 105)
У меня больше нет идей, что я еще могу попробовать. Единственное, что я хочу сделать, это сопоставить значения из списка с CarTypes с уже существующим списком с FleetContractDtos.
Было бы очень хорошо, если бы кто-то мог мне помочь.