当 objectmapper 读取值时,JsonDeserialize 也设置继承的属性
JsonDeserialize set inherited properties also when objectmapper readvalue
Json当 objectmapper 读取继承属性的值时反序列化不起作用。
车辆Class
@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{
}
}
汽车class
@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 {
}
}
我不想在两个 class 中创建 @NoArgsConstructor ,@AllArgsConstructor
。
Car car = om.readValue(jsonValue,Car.class);
我的问题
当我将 Json 解析为 java 对象时,父 class 属性设置不正确。
截至目前,我正在使用 @NoArgsConstructor ,@AllArgsConstructor
解决用例问题。
有什么方法可以和@JsonDeserialize and @JsonPOJOBuilder
一起使用吗?
代码的问题在于它假定继承 classes 中的构建器也会设置 parent 属性。不幸的是,他们并没有开箱即用。然而,这可以通过 Lombok 实现,但需要一些额外的代码,如 post.
中所述
完整的解决方案如下所示。
Parent Class
@Getter
@Setter
@JsonDeserialize
@Builder(builderClassName = "VehicleBuilder", builderMethodName = "vehicleBuilder")
public class Vehicle {
private String name;
private String noOfTyres;
}
Child Class
@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 {
}
}
请注意,扩展 class 上的构建器是通过提供带有 @Builder 注释的构造函数来实现的。另请注意,扩展 class 不会设置注释参数 toBuilder=true,因为这将需要访问私有的 parent 属性。这可以通过将 parent class 属性设置为受保护来实现。
Json当 objectmapper 读取继承属性的值时反序列化不起作用。
车辆Class
@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{
}
}
汽车class
@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 {
}
}
我不想在两个 class 中创建 @NoArgsConstructor ,@AllArgsConstructor
。
Car car = om.readValue(jsonValue,Car.class);
我的问题
当我将 Json 解析为 java 对象时,父 class 属性设置不正确。
截至目前,我正在使用 @NoArgsConstructor ,@AllArgsConstructor
解决用例问题。
有什么方法可以和@JsonDeserialize and @JsonPOJOBuilder
一起使用吗?
代码的问题在于它假定继承 classes 中的构建器也会设置 parent 属性。不幸的是,他们并没有开箱即用。然而,这可以通过 Lombok 实现,但需要一些额外的代码,如 post.
中所述完整的解决方案如下所示。
Parent Class
@Getter
@Setter
@JsonDeserialize
@Builder(builderClassName = "VehicleBuilder", builderMethodName = "vehicleBuilder")
public class Vehicle {
private String name;
private String noOfTyres;
}
Child Class
@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 {
}
}
请注意,扩展 class 上的构建器是通过提供带有 @Builder 注释的构造函数来实现的。另请注意,扩展 class 不会设置注释参数 toBuilder=true,因为这将需要访问私有的 parent 属性。这可以通过将 parent class 属性设置为受保护来实现。