首页 > 解决方案 > JsonDeserialize 在 objectmapper 读取值时也设置继承的属性

问题描述

当 objectmapper 读取继承属性的值时,JsonDeserialize 不起作用。

车辆类别

@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在这两个类中创建。当我将 Json 解析为 java 对象时,我的问题Car car = om.readValue(jsonValue,Car.class); 是父类属性设置不正确。

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

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

标签: javajsonbuilderjson-deserialization

解决方案


代码的问题在于它假定继承类中的构建器也将设置父属性。不幸的是,他们并没有开箱即用。但是,这可以通过 Lombok 实现,但需要一些额外的代码,如本文所述

一个完整的解决方案可能如下所示。

家长班

@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因为这将需要访问私有的父属性。这可以通过将父类属性设置为受保护来实现。


推荐阅读