繁体   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