当 objectmapper 读取值时,JsonDeserialize 也设置继承的属性

JsonDeserialize set inherited properties also when objectmapper readvalue

Json当 objectmapper 读取继承属性的值时反序列化不起作用。

车辆Class

@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{
    }
}

汽车class

@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 {
    }
}

我不想在两个 class 中创建 @NoArgsConstructor ,@AllArgsConstructorCar car = om.readValue(jsonValue,Car.class); 我的问题 当我将 Json 解析为 java 对象时,父 class 属性设置不正确。

截至目前,我正在使用 @NoArgsConstructor ,@AllArgsConstructor 解决用例问题。

有什么方法可以和@JsonDeserialize and @JsonPOJOBuilder一起使用吗?

代码的问题在于它假定继承 classes 中的构建器也会设置 parent 属性。不幸的是,他们并没有开箱即用。然而,这可以通过 Lombok 实现,但需要一些额外的代码,如 post.

中所述

完整的解决方案如下所示。

Parent Class

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

}

Child Class

@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 {
    }

}

请注意,扩展 class 上的构建器是通过提供带有 @Builder 注释的构造函数来实现的。另请注意,扩展 class 不会设置注释参数 toBuilder=true,因为这将需要访问私有的 parent 属性。这可以通过将 parent class 属性设置为受保护来实现。