【问题标题】:RestEasy + JacksonJaxbJsonProvider configuring inclusion + annotationsRestEasy + JacksonJaxbJsonProvider 配置包含 + 注释
【发布时间】:2014-05-26 18:03:35
【问题描述】:

我正在尝试在 RestEasy 中配置 jackson-module-jaxb-annotations-2.2.1 以在 Json 中输出空数组。

我用下一个代码来做:

@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class JacksonIncludeNullJsonProvider extends JacksonJaxbJsonProvider
{
    public JacksonIncludeNullJsonProvider() {
        ObjectMapper mapper =  new ObjectMapper();

        configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true);
        mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.ALWAYS);

        super.setMapper(mapper);
    }
}

但是当我用这个类编译项目时,所有的 JAXB 注释都停止工作了。

据我了解,当我在自己的提供程序中注册映射器时,它会清空 JacksonJaxbJsonProvider 中的所有默认设置。 JAXB 注释 + 空数组包含必须进行哪些配置才能正常工作?

【问题讨论】:

    标签: java json jaxb jackson


    【解决方案1】:

    默认情况下,在您的示例的构造函数中创建的对象映射器未配置为支持 JAXB 注释。您应该重新使用由 JacksonJaxJsonProvider 超类提供的内部映射器,或者配置您的映射器以支持 JAXB 注释。这是the Jackson JAX-RS wiki.的链接

    这是一个基于问题的 JacksonJaxJsonProvider 子类示例,它在构造函数中自定义内部对象映射器(虽然不是很优雅的解决方案)。

    请注意,我已经反转了原始问题的序列化设置,因为它们不会更改默认值以显示不同提供程序的输出差异。

    public class JacksonProvider {
        public static class JacksonIncludeNullJsonProvider extends JacksonJaxbJsonProvider
        {
            public JacksonIncludeNullJsonProvider() {
                // must be the first call to initialize the mapper
                configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, false);
                _mapperConfig.getConfiguredMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
            }
    
        }
    
        public static class Bean {
            @XmlElement(name = "xmlField1")
            public final String field1;
            public final String field2;
            public final String field3 = null;
            public final Map<String, Object> field4 = Collections.emptyMap();
    
            public Bean(String field1, String field2) {
                this.field1 = field1;
                this.field2 = field2;
            }
        }
    
        public static void main(String[] args) throws IOException {
            JacksonIncludeNullJsonProvider provider = new JacksonIncludeNullJsonProvider();
            JacksonJaxbJsonProvider provider2 = new JacksonJaxbJsonProvider();
            Bean bean = new Bean("a", "b");
            provider.writeTo(bean, Bean.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, System.out);
            System.out.println();
            provider2.writeTo(bean, Bean.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, System.out);
        }
    }
    

    输出:

    {"xmlField1":"a","field2":"b"}
    {"xmlField1":"a","field2":"b","field3":null,"field4":{}}   
    

    【讨论】:

    • 谢谢,但是在 Java 中将空数组输出为 JSON 数组必须进行什么配置? public final List&lt;Object&gt; field4 = null; 必须解释为:"field4":[] 当我创建新的未配置映射器时,如在我的第一条消息中,我有这个结果,但不是使用现有的映射器。
    • 如果字段为空,你想输出一个空数组,不是吗?
    • 是的。当我创建ObjectMapper mapper = new ObjectMapper() 时,它可以工作,所以我认为这是配置问题,可以使用现有的 JacksonJaxbJsonProvider 的映射器来做到这一点。但我不知道,设置什么设置。
    • 很有趣,但我无法重现这一点。不确定这些设置是否会影响空数组的序列化。我认为实现这一点的方法是设置一个特殊的 NullSerializer 它将为所有数组类型编写一个空数组。看看底部this wiki page
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2022-10-02
    相关资源
    最近更新 更多