Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson滤波器与多态性_Java_Json_Jakarta Ee_Jackson_Polymorphism - Fatal编程技术网

Java Jackson滤波器与多态性

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

我有一个抽象类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 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);
    
  • 视图也不太容易出错,因为匹配类型而不是字符串,也就是说,如果视图名称中有输入错误,IDE将突出显示它。使用
    @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);
    
  • 视图也不太容易出错,因为匹配类型而不是字符串,也就是说,如果视图名称中有输入错误,IDE将突出显示它。使用
    @JsonFilter
    ids可以获得运行时错误


    我想,术语“子类”在
    @JsonView
    中提到,但在
    @JsonFilter
    中没有提到,这一事实对于观察到的行为来说是一个很好的解释。

    如果所有这些都很重要,那就是它是一辆车,为什么你有
    @JsonFilter('Car_Filter')
    ?和
    @JsonFilter('Bike_Filter')
    ?因为在应用程序的其他部分,我需要分别显示汽车和自行车。如果重要的是,它是一辆车,为什么您有
    @JsonFilter('Car_Filter')
    ?和
    @JsonFilter('Bike_Filter')
    ?因为在应用程序的其他部分中,我需要分别显示汽车和自行车。我尝试了所有的解决方案,所有的解决方案都有效!我更喜欢使用视图的视图,因为它更加面向对象,更加Java;)而且,对于那些讨厌写纯字符串的人来说,这真是一种解脱!谢谢!我尝试了所有的解决方案,所有的都奏效了!我更喜欢使用视图的视图,因为它更加面向对象,更加Java;)而且,对于那些讨厌写纯字符串的人来说,这真是一种解脱!谢谢!