java - JsonDeserialize 在 objectmapper 读取值时也设置继承的属性
问题描述
当 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
在这两个类中创建。当我将 Json 解析为 java 对象时,我的问题Car car = om.readValue(jsonValue,Car.class);
是父类属性设置不正确。
截至目前,我正在使用@NoArgsConstructor ,@AllArgsConstructor
解决用例。
有什么方法可以一起使用@JsonDeserialize and @JsonPOJOBuilder
吗?
解决方案
代码的问题在于它假定继承类中的构建器也将设置父属性。不幸的是,他们并没有开箱即用。但是,这可以通过 Lombok 实现,但需要一些额外的代码,如本文所述。
一个完整的解决方案可能如下所示。
家长班
@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因为这将需要访问私有的父属性。这可以通过将父类属性设置为受保护来实现。
推荐阅读
- postman - Netsuite API 集成邮递员
- html - 当我悬停在元素旁边时,元素的悬停效果起作用
- php - 使用正则表达式检查带有破折号的数字
- scala - Flink StreamingFileSink RowFormatBuilder with BucketAssigner 返回 Any?
- java - th 中的值:嵌套在 th 中的文本:thymeleaf 中的操作
- kubernetes - 节点资源不足:[DiskPressure]。但 df -h 仅显示 47% 的使用率
- laravel-6 - 数据表警告:表 id=laravel 数据表 - 异常消息未定义索引 yajra
- vue.js - 消除图标按钮上的波纹效果
- laravel - Laravel 6.x Auth 脚手架路由“verification.resend”不去 VerificationController@resend?
- javascript - 将搜索按钮添加到用于将 XML 数据获取到 HTML 表的函数中