是的,它可以用于抽象类和接口。
考虑以下代码示例
假设我们有一个枚举,接口和类
enum VehicleType {
CAR,
PLANE
}
interface Vehicle {
VehicleType getVehicleType();
String getName();
}
@NoArgsConstructor
@Getter
@Setter
class Car implements Vehicle {
private boolean sunRoof;
private String name;
@Override
public VehicleType getVehicleType() {
return VehicleType.Car;
}
}
@NoArgsConstructor
@Getter
@Setter
class Plane implements Vehicle {
private double wingspan;
private String name;
@Override
public VehicleType getVehicleType() {
return VehicleType.Plane;
}
}
如果我们尝试将这个json反序列化为
List<Vehicle>
。
[
{"sunRoof":false,"name":"Ferrari","vehicleType":"CAR"},
{"wingspan":19.25,"name":"Boeing 750","vehicleType":"PLANE"}
]
然后我们会遇到错误。
abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
为了解决这个问题,只需按照下面的示例,在接口中添加以下
JsonSubTypes
和
JsonTypeInfo
注释即可。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
property = "vehicleType")
@JsonSubTypes({
@JsonSubTypes.Type(value = Car.class, name = "CAR"),
@JsonSubTypes.Type(value = Plane.class, name = "PLANE")
})
interface Vehicle {
VehicleType getVehicleType();
String getName();
}
使用此方法,反序列化将与接口一起工作,并返回一个List<Vehicle>
您可以在此处查看代码 - https://github.com/chatterjeesunit/java-playground/blob/master/src/main/java/com/play/util/jackson/PolymorphicDeserialization.java