【问题标题】:Is it possible to use @XmlHeader together with Jackson?是否可以将@XmlHeader 与杰克逊一起使用?
【发布时间】:2016-06-24 15:18:51
【问题描述】:

我正在用 Jackson(注释)将我的对象编组为 JSON 和 XML,它的效果非常好,但是 XML 存在问题。我想添加一个 DTD 文件。我搜索了一下,发现了 @XmlHeader-注解(org.glassfish.jersey.message.XmlHeader)添加一个header:

@Path("resources/xml/hashtagstatistic")
@GET
@XmlHeader("<!DOCTYPE note SYSTEM \"test.dtd\">")
@Produces(MediaType.APPLICATION_XML)

public Database getStatisticAsXml(){
    return serviceController.getDatabase();
}

但它不起作用。我对 jaxb 进行了同样的尝试,并将标头添加到我的 XML-Output 中。但我想使用 Jackson,因为它可以轻松返回我想要的结构(我不喜欢/想要适配器)。是否有可能解决此问题,或者是否有其他解决方案来处理标头的此问题?

【问题讨论】:

    标签: java xml jaxb jackson jax-rs


    【解决方案1】:

    是的,这是针对泽西岛的注释,所以杰克逊对此一无所知。我看到几个选项。您可以使用WriterInterceptor,然后自己编写标题。

    @Provider
    public class XmlHeaderWriterInterceptor implements WriterInterceptor {
    
        @Context
        private ResourceInfo info;
    
        @Override
        public void aroundWriteTo(WriterInterceptorContext context)
                        throws IOException, WebApplicationException {
            final OutputStream outputStream = context.getOutputStream();
    
            XmlHeader anno = info.getResourceMethod().getAnnotation(XmlHeader.class);
            if (anno != null) {
                String value = anno.value();
                writeToStream(outputStream, value);
            }
            context.proceed();
        }
    }
    

    或者您可以创建一个MessageBodyWriter。但是,您可以扩展the one from Jackson(假设这是您当前正在使用的),而不是从头开始实现自己的

    @Provider
    public class MyJackonXmlProvier extends JacksonJaxbXMLProvider {
    
        @Context
        private ResourceInfo info;
    
        @Override
        public void writeTo(Object value, Class<?> type, Type genericType,
                            Annotation[] annotations, MediaType mediaType,
                            MultivaluedMap<String,Object> httpHeaders, 
                            OutputStream entityStream) {
    
            // do same thing as example above
            super.writeTo(pass, all, arguments)
    }
    

    无论您使用哪个,只要确保在应用程序中注册即可。

    【讨论】:

    • 好的,真棒!它对我有用:)。我以前从未听说过 WriterInterceptors,因为我是这个话题的新手。用简单的 outputStream.write(value.getBytes()) 替换您的 writeToStream-Methode 是否正确?谢谢:)
    • 是的,你可以这样做。
    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多