我正在用Jackson (注释)将我的对象编组到JSON & XML中,它非常好用,但是XML有一个问题。我想添加一个DTD-文件。我搜索了一点,找到了@XmlHeader (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中,但是我想使用Jackson,因为它返回了我想要的结构(我不喜欢/想要适配器)。是否存在修复此问题的可能性,或者是否有其他解决方案来使用标头处理此问题?
发布于 2016-06-24 15:41:05
是的,这是泽西岛的一个特定注释,所以杰克逊对此一无所知。我看到了几个选择。您可以使用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
。但是,与其从头开始实现自己的功能,不如扩展杰克逊的那个 (假设这是您当前使用的)。
@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)
}
无论您使用哪一种,只要确保将其注册到应用程序中即可。
https://stackoverflow.com/questions/38016811
复制相似问题