JsonDeserialize也继承了objectmapper的readvalue

问题描述 投票:0回答:1

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

到目前为止,我正在使用@NoArgsConstructor ,@AllArgsConstructor解决该用例。

有没有办法与@JsonDeserialize and @JsonPOJOBuilder一起使用?

java json builder json-deserialization
1个回答
0
投票

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

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

家长班

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

© www.soinside.com 2019 - 2024. All rights reserved.