可以和Jackson一起使用@XmlHeader吗?

时间:2016-06-24 15:18:51

标签: java xml jaxb jackson jax-rs

我用Jackson(注释)将我的对象编组到JSON& XML并且它工作得非常好但是XML存在问题。我想添加一个DTD-File。我搜索了一下,找到了@ XmlHeader-Annotation(org.glassfish.jersey.message.XmlHeader)来添加标题:

@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,因为它返回了我想要的结构(我不喜欢/想要适配器)。是否有可能解决此问题或是否有其他解决方案来处理标题的这个问题?

1 个答案:

答案 0 :(得分:2)

是的,这是泽西岛特有的注释,所以杰克逊不会对此有任何了解。我看到了几个选项。您可以使用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)
}

您使用的是哪一个,只需确保将其注册到应用程序中。