当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
。Car car = om.readValue(jsonValue,Car.class);
时我的问题当我将Json解析为java对象时,父类属性设置不正确。
到目前为止,我正在使用@NoArgsConstructor ,@AllArgsConstructor
解决该用例。
有没有办法与@JsonDeserialize and @JsonPOJOBuilder
一起使用?
代码的问题在于,它假设继承类中的构建器也会设置父属性。不幸的是,他们没有开箱即用。但是,这是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来实现。