ModelMapper: сопоставить список объектов (со связанной строкой) с другим списком объектов - PullRequest
0 голосов
/ 03 марта 2019

Я искал решение во всем Интернете, но не смог найти работающее для меня.

Я хочу сопоставить следующий класс

Класс 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.

Было бы очень хорошо, если бы кто-то мог мне помочь.

...