![](/img/trans.png)
[英]Jackson ObjectMapper readValue expected behavior when class properties change
[英]JsonDeserialize set inherited properties also when objectmapper readvalue
当对象映射器读取继承属性的值时,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
一起使用吗?
代码的问题在于它假定继承类中的构建器也将设置父属性。 不幸的是,他们并没有开箱即用。 然而,这是后话,可与龙目岛可以实现,但需要一些额外的代码,如在此描述的职位。
一个完整的解决方案可能如下所示。
家长班
@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 来实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.