为了获得json响应,重新定义了一种与Jackson集成的方法。 使用reseasy-jackson-provider和resteasy-jackson2-provider。
Jackson也可以用于将反序列化从\解析为XML。即使用jackson-jaxrs-xml-provider和jackson-dataformat-xml。但是使用这些并生成XML响应失败了
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>
资源
@GET
@Path("/foo/{id}")
@Produces({MediaType.APPLICATION_XML})
public Foo getFoo(@PathParam("id") int id);
答案 0 :(得分:1)
JAXB是将Java类映射到XML和XML模式的注释框架。要在Resteasy中使用JAXB,您需要将resteasy-jaxb-provider添加到依赖项中
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
然后,将xml注释添加到响应类中。例如:
@XmlRootElement(name="user")
class User {
int id;
String name;
@XmlElement(name="id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement(name="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
更新:
由于Resteasy没有基于Jackson的内置xml提供程序,如果你不喜欢JAXB注释,你也可以编写自己的处理程序。
使用以下依赖项,因为在杰克逊2.1之后不推荐jackson-jaxrs-xml-provider
:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>{jackson-version}</version>
</dependency>
在您的项目中,实施javax.ws.rs.ext.MessageBodyWriter
界面。
示例代码:
@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);
}
}
JAX-RS运行时将查看每个作者的@Produces
注释并调用MessageBodyWriter.isWriteable()
方法;那么您的自定义MessageBodyWriter
将被选中来完成工作
答案 1 :(得分:1)
创建 https://issues.jboss.org/browse/RESTEASY-1352
让我们看看它是否会进入resteasy工件。
答案 2 :(得分:0)
除了放手
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
<version>${jackson.version}</version>
</dependency>
在您的POM文件中,删除所有JAXB(@ Xml *)批注。 JAXB批注将触发默认提供程序。
经过Thorntail和Jackson 2.9的测试。