JsonDeserialize устанавливает унаследованные свойства также при чтении объекта. - PullRequest
0 голосов
/ 19 февраля 2020

JsonDeserialize не работает, когда objectmapper читает значение для унаследованных свойств.

Класс автомобиля

@Getter
@Setter
@JsonDeserialize(builder = Vehicle.VehicleBuilder.class)
@Builder(builderClassName = "VehicleBuilder", toBuilder = true)
public class Vehicle{
    private String name;
    private String noOfTyres;
    @JsonPOJOBuilder(withPrefix = "")
    public static class VehicleBuilder{
    }
}

Класс автомобиля

@Getter
@Setter
@JsonDeserialize(builder = Car.CarBuilder.class)
@Builder(builderClassName = "CarBuilder", toBuilder = true)
public class Car extends Vehicle {
    private String carType;

    @JsonPOJOBuilder(withPrefix = "")
    public static class CarBuilder extends VehicleBuilder {
    }
}

Я не хочу создавать @NoArgsConstructor ,@AllArgsConstructor в обоих классах. Моя проблема, когда Car car = om.readValue(jsonValue,Car.class); Когда я анализирую Json в java объект, свойства родительского класса не устанавливаются должным образом.

На данный момент я использую @NoArgsConstructor ,@AllArgsConstructor для обхода варианта использования.

Есть ли способ использовать его вместе с @JsonDeserialize and @JsonPOJOBuilder?

1 Ответ

1 голос
/ 19 февраля 2020

Проблема с кодом заключается в том, что он предполагает, что сборщики в унаследованных классах также будут устанавливать родительские свойства. К сожалению, они не делают это из коробки. Тем не менее, это то, что может быть достигнуто с Lombok, но требует некоторого дополнительного кода, как описано в этом post .

Полное решение может выглядеть следующим образом.

Parent Класс

@Getter
@Setter
@JsonDeserialize
@Builder(builderClassName = "VehicleBuilder", builderMethodName = "vehicleBuilder")
public class Vehicle {
    private String name;
    private String noOfTyres;

}

Дочерний класс

@Getter
@Setter
@JsonDeserialize(builder = Car.CarBuilder.class)
public class Car extends Vehicle {

    private String carType;

    @Builder
    public Car(String name, String noOfTyres, String carType) {
        super(name, noOfTyres);
        this.carType = carType;
    }

    @JsonPOJOBuilder(withPrefix = "")
    public static class CarBuilder extends VehicleBuilder {
    }

}

Обратите внимание, что компоновщик расширяющего класса достигается путем предоставления конструктору аннотации @Builder. Также обратите внимание, что расширяющий класс не устанавливает параметр аннотации toBuilder = true , поскольку для этого потребуется доступ к родительским свойствам, которые являются частными. Это может быть достигнуто путем установки свойств родительского класса для защищенных.

...