java - RestEasy + JacksonJaxbJsonProvider 配置包含 + 注释

标签 java json jaxb jackson

我正在尝试在 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 注释 + 空数组包含正确工作必须采用什么配置?

最佳答案

默认情况下,在示例的构造函数中创建的对象映射器未配置为支持 JAXB 注释。您应该重用 JacksonJaxJsonProvider 父类(super class)提供的内部映射器,或者配置您的映射器以支持 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 - RestEasy + JacksonJaxbJsonProvider 配置包含 + 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23875588/

相关文章:

java - ImageIO.write() 低质量图像

javascript - 如何将json数据转换成BPMN兼容格式?

java - 学习 Java Web 服务细节的资源?

java - 通过 @XmlPath MOXy 注释解码嵌套集合

java - jaxb 抛出 javax.xml.bind.UnmarshalException : Expected elements are (none) only when running in osgi bundle

java - 如何处理 JMS 中的消息顺序?

json - 访问以数字命名的属性

java - 字符串压缩: Passing Object Through URL

java - 还有其他方法可以不在每个包中重复 Jaxb 中的包信息吗?

java - FFMPEG 和 JNI - 将 AVFrame 数据传递给 Java 并返回