Java 放松3+;杰克逊&x2B;Tomcat+;XML响应
为了获得json响应,reseasy定义了一种与Jackson集成的方法。 使用reseasy jackson提供程序和resteasy-jackson2提供程序 Jackson还可用于将从\反序列化为XML。i、 与jackson jaxrs xml提供程序和jackson dataformat xml一起使用。但是,使用这些方法并生成XML响应失败Java 放松3+;杰克逊&x2B;Tomcat+;XML响应,java,xml,tomcat,jackson,resteasy,Java,Xml,Tomcat,Jackson,Resteasy,为了获得json响应,reseasy定义了一种与Jackson集成的方法。 使用reseasy jackson提供程序和resteasy-jackson2提供程序 Jackson还可用于将从\反序列化为XML。i、 与jackson jaxrs xml提供程序和jackson dataformat xml一起使用。但是,使用这些方法并生成XML响应失败 org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find
org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: someclass of media type: application/xml
使用的依赖项
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-validator-provider-11</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>${jackson.version}</version>
</dependency>
JAXB是将Java类映射到XML和XML模式的注释框架
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
更新:由于Resteasy没有基于Jackson的内置xml提供程序,如果您不喜欢JAXB注释,也可以编写自己的处理程序
使用以下依赖项是因为在jackson 2.1之后不推荐使用
jackson jaxrs xml提供程序
:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>{jackson-version}</version>
</dependency>
JAX-RS运行时将查看每个编写器的@生成的注释,并调用MessageBodyWriter.isWriteable()
方法;然后将选择您的自定义MessageBodyWriter
来执行创建的作业
让我们看看它是否进入resteasy工件。除了放置
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>${jackson.version}</version>
</dependency>
com.fasterxml.jackson.jaxrs
jackson jaxrs xml提供程序
${jackson.version}
对于POM文件,删除所有JAXB(@Xml*)注释。JAXB注释将触发默认提供程序
用Thorntail和Jackson 2.9测试。问题是什么?问题是如何使用resteady-jackson2-provider jar中的jacksonat从resteasy获取xml响应有一个名为Jackson2JsonInterceptor的编写器拦截器。我觉得xml也需要类似的方法才能工作。有没有一种方法可以在不向模型类添加注释的情况下实现它。有了jackson,这是可能的,我能够用resteasy返回json。正在尝试使用jackson返回xml。@jathinsanghvi当前没有内置的处理程序或提供程序允许您自动将Java对象转换为xml()。即使如此,您也可以通过实现javax.ws.rs.ext.MessageBodyWriter接口和Jackson xml组件来编写自己的处理程序。这看起来很简单。。我得试试。我正在考虑实现com.fasterxml.jackson.jaxrs.xml.JacksonJaxbXMLProvider。实现类类似于org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider。然后可以在更通用的上下文中使用它。
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>{jackson-version}</version>
</dependency>
@Provider
@Produces("application/xml")
public class XMLMarshaller implements MessageBodyWriter<Object> {
@Override
public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public long getSize(Object obj, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
public void writeTo(Object obj, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException,
WebApplicationException {
ObjectMapper xmlMapper = new XmlMapper();
xmlMapper.writeValue(entityStream, obj);
}
}
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>${jackson.version}</version>
</dependency>