Java Jackson滤波器与多态性
我有一个抽象类Vehicle:Java Jackson滤波器与多态性,java,json,jakarta-ee,jackson,polymorphism,Java,Json,Jakarta Ee,Jackson,Polymorphism,我有一个抽象类Vehicle: @JsonFilter('Vehicle_Filter') public abstract class Vehicle { private String brand; private int nbOfWheels; //Other attributes, constructor & methods } 我有一辆儿童级汽车扩展车辆: @JsonFilter('Car_Filter') public class Car extends
@JsonFilter('Vehicle_Filter')
public abstract class Vehicle {
private String brand;
private int nbOfWheels;
//Other attributes, constructor & methods
}
我有一辆儿童级汽车扩展车辆:
@JsonFilter('Car_Filter')
public class Car extends Vehicle {
private int nbOfDoors;
private boolean isElectric;
//Other attributes, constructor & methods
}
@JsonFilter('Bike_Filter')
public class Bike extends Vehicle {
private double tirePressure;
private boolean isAllTerrain;
//Other attributes, constructor & methods
}
我还有另外一个儿童班自行车扩展车辆:
@JsonFilter('Car_Filter')
public class Car extends Vehicle {
private int nbOfDoors;
private boolean isElectric;
//Other attributes, constructor & methods
}
@JsonFilter('Bike_Filter')
public class Bike extends Vehicle {
private double tirePressure;
private boolean isAllTerrain;
//Other attributes, constructor & methods
}
假设我有一个类VehicleCollection,表示我希望在HTML页面中显示的车辆列表:
@JsonFilter('VehicleCollection_Filter')
public abstract class VehicleCollection {
private List<Vehicle> vehicles;
//Other attributes, constructor & methods
}
。。。但是在调用编写器时,会抛出此错误:无法找到id为“Car\u filter”的筛选器。
。看来Jackson不想听到多态性
有人有过同样的问题吗?如果是的话,我能告诉你如何克服它吗?如果没有,关于Jackson filter为什么不能处理继承问题,是否有一些文档或一些隐含的解释?首先,您遇到的错误是,当Jackson序列化一个
Car
实例时,它会在类上看到一个@JsonFilter
注释,并期望通过该筛选器找到一个具有给定id的筛选器提供者
解决方法:
.setFailOnUnknownId(false)代码>将消除错误,但会导致所有字段序列化
。设置默认过滤器(filterOutAllExcept(“品牌”、“nbOfDoors”、“isElectric”)
,当“自行车过滤器”
和“汽车过滤器”
无法找到时,将应用该过滤器。这将获得所需的输出,但灵活性有限。每个过滤器提供程序的所有类都有一个默认过滤器,所有过滤器提供程序的每个类都有一个过滤器。例如,您不能使用3个过滤器对类进行注释,然后在提供程序中选择其中一个过滤器@JsonView
。与过滤器不同,视图本身支持(多重)继承,您可以为每个字段/getter指定多于1个,这提供了极大的灵活性。例如:
abstract class Vehicle {
@JsonView(Detail.Basic.class)
private String brand;
@JsonView(Detail.Standard.class)
private int nbOfWheels;
}
class Car extends Vehicle {
@JsonView(Detail.FullCar.class)
private int nbOfDoors;
// multiple views on a field
@JsonView({Detail.Standard.class, Detail.Type.class})
private boolean electric;
}
class Bike extends Vehicle {
@JsonView(Detail.FullBike.class)
private int tirePressure;
@JsonView({Detail.Standard.class, Detail.Type.class})
private boolean allTerrain;
}
class Detail {
// marker interfaces never implemented
interface Basic {}
interface Type {}
interface Standard extends Basic {}
interface FullCar extends Basic {}
interface FullBike extends Basic {}
// 1 view can inherit from many
interface Full extends FullCar, FullBike {}
}
ObjectMapper mapper = new ObjectMapper();
// only 1 view per writer
ObjectWriter basicWriter = mapper.writerWithView(Detail.Basic.class);
ObjectWriter standardWriter = mapper.writerWithView(Detail.Standard.class);
ObjectWriter typeWriter = mapper.writerWithView(Detail.Type.class);
@JsonFilter
ids可以获得运行时错误
我猜事实是“子类”在
@JsonView
中提到了,但在@JsonFilter
中没有提到,这是对观察到的行为的最好的解释。首先,您得到的错误是,当Jackson序列化一个Car
实例时,它在类上看到一个@JsonFilter
注释,并期望找到一个带有通过筛选器提供程序指定id
解决方法:
.setFailOnUnknownId(false)代码>将消除错误,但会导致所有字段序列化
。设置默认过滤器(filterOutAllExcept(“品牌”、“nbOfDoors”、“isElectric”)
,当“自行车过滤器”
和“汽车过滤器”
无法找到时,将应用该过滤器。这将获得所需的输出,但灵活性有限。每个过滤器提供程序的所有类都有一个默认过滤器,所有过滤器提供程序的每个类都有一个过滤器。例如,您不能使用3个过滤器对类进行注释,然后在提供程序中选择其中一个过滤器@JsonView
。与过滤器不同,视图本身支持(多重)继承,您可以为每个字段/getter指定多于1个,这提供了极大的灵活性。例如:
abstract class Vehicle {
@JsonView(Detail.Basic.class)
private String brand;
@JsonView(Detail.Standard.class)
private int nbOfWheels;
}
class Car extends Vehicle {
@JsonView(Detail.FullCar.class)
private int nbOfDoors;
// multiple views on a field
@JsonView({Detail.Standard.class, Detail.Type.class})
private boolean electric;
}
class Bike extends Vehicle {
@JsonView(Detail.FullBike.class)
private int tirePressure;
@JsonView({Detail.Standard.class, Detail.Type.class})
private boolean allTerrain;
}
class Detail {
// marker interfaces never implemented
interface Basic {}
interface Type {}
interface Standard extends Basic {}
interface FullCar extends Basic {}
interface FullBike extends Basic {}
// 1 view can inherit from many
interface Full extends FullCar, FullBike {}
}
ObjectMapper mapper = new ObjectMapper();
// only 1 view per writer
ObjectWriter basicWriter = mapper.writerWithView(Detail.Basic.class);
ObjectWriter standardWriter = mapper.writerWithView(Detail.Standard.class);
ObjectWriter typeWriter = mapper.writerWithView(Detail.Type.class);
@JsonFilter
ids可以获得运行时错误
我想,术语“子类”在
@JsonView
中提到,但在@JsonFilter
中没有提到,这一事实对于观察到的行为来说是一个很好的解释。如果所有这些都很重要,那就是它是一辆车,为什么你有@JsonFilter('Car_Filter')
?和@JsonFilter('Bike_Filter')
?因为在应用程序的其他部分,我需要分别显示汽车和自行车。如果重要的是,它是一辆车,为什么您有@JsonFilter('Car_Filter')
?和@JsonFilter('Bike_Filter')
?因为在应用程序的其他部分中,我需要分别显示汽车和自行车。我尝试了所有的解决方案,所有的解决方案都有效!我更喜欢使用视图的视图,因为它更加面向对象,更加Java;)而且,对于那些讨厌写纯字符串的人来说,这真是一种解脱!谢谢!我尝试了所有的解决方案,所有的都奏效了!我更喜欢使用视图的视图,因为它更加面向对象,更加Java;)而且,对于那些讨厌写纯字符串的人来说,这真是一种解脱!谢谢!