![](/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.