Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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 @JsonView未传播到(“嵌套”)自定义序列化程序_Java_Spring_Jackson_Json View - Fatal编程技术网

Java @JsonView未传播到(“嵌套”)自定义序列化程序

Java @JsonView未传播到(“嵌套”)自定义序列化程序,java,spring,jackson,json-view,Java,Spring,Jackson,Json View,在下面的单元测试中有两个bean:beanA和beanB,其中beanA包含对beanB的引用 使用自定义序列化程序序列化提供JSON视图的bean时,beanB的自定义序列化程序不知道提供的JSON视图,因为测试的输出为: { "clazz" : "BeanA", "activeView" : "ViewTest", "beanB" : { "clazz" : "BeanB", "activeView" : null } } 我发现传播activeView的唯

在下面的单元测试中有两个bean:beanA和beanB,其中beanA包含对beanB的引用

使用自定义序列化程序序列化提供JSON视图的bean时,beanB的自定义序列化程序不知道提供的JSON视图,因为测试的输出为:

{
  "clazz" : "BeanA",
  "activeView" : "ViewTest",
  "beanB" : {
    "clazz" : "BeanB",
    "activeView" : null
  }
}
我发现传播activeView的唯一方法是:参见下面的完整源代码

ObjectMapper mapper = (ObjectMapper) gen.getCodec();
mapper.setConfig(provider.getConfig());
但是setConfig的JavaDoc说只有当你知道你在做什么的时候才使用这个方法,而我显然不这么做

因此,我的问题是:

这种传播JSON视图的方式可以吗? 有更好的办法吗? 有人能解释一下这种默认行为吗? 有一些行被***注释掉了-这些只有在没有自定义序列化程序的情况下才有趣,在这种情况下,JSON视图似乎被传播

public class ViewTest {

    @Test
    public void hello() throws JsonProcessingException {

        BeanA beanA = new BeanA();
        beanA.beanB = new BeanB();

        String result = new ObjectMapper()
//            .disable(MapperFeature.DEFAULT_VIEW_INCLUSION) // ***
            .writerWithView(ViewTest.class)
            .withDefaultPrettyPrinter()
            .writeValueAsString(beanA);

        System.out.println(result);
    }

    @JsonSerialize(using = BeanASerializer.class)
    static public class BeanA {

//        @JsonView(ViewTest.class) // ***
        public String clazz = this.getClass().getSimpleName();

//        @JsonView(ViewTest.class) // ***
        public BeanB beanB;
    }

    @JsonSerialize(using = BeanBSerializer.class)
    static public class BeanB {

//        @JsonView(ViewTest.class) // ***
        public String clazz = this.getClass().getSimpleName();
    }

    static void writeClazzAndActiveView(String clazz, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStringField("clazz", clazz);
        gen.writeFieldName("activeView");
        if (provider.getActiveView() == null) {
            gen.writeNull();
        } else {
            gen.writeString(provider.getActiveView().getSimpleName());
        }
    }

    static class BeanASerializer extends JsonSerializer<BeanA> {

        @Override
        public void serialize(BeanA bean, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {

            gen.writeStartObject();
            writeClazzAndActiveView(bean.clazz, gen, provider);

            // the only way I found to propagate the activeView:
//            ObjectMapper mapper = (ObjectMapper) gen.getCodec();
//            mapper.setConfig(provider.getConfig());

            gen.writeObjectField("beanB", bean.beanB);
            gen.writeEndObject();
        }
    }

    static class BeanBSerializer extends JsonSerializer<BeanB> {

        @Override
        public void serialize(BeanB bean, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {

            gen.writeStartObject();
            writeClazzAndActiveView(bean.clazz, gen, provider);
            gen.writeEndObject();
        }
    }
}

应通过SerializerProvider正确传播活动。您是对的,您不应该也不必这样设置视图——首先,它不是线程安全的,ObjectMapper的所有配置都要在使用之前完成 ObjectReader和ObjectWriter允许通过各种工厂方法更改每次调用

发生这种情况的原因尚不清楚:我认为用版本信息和完整的复制(如果不仅仅是代码)来归档bug是有意义的。

类似:谢谢&完成: