簡體   English   中英

當 objectmapper 讀取值時,JsonDeserialize 也設置繼承的屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM