高枕无忧 3 + 杰克逊 + Tomcat + XML 回应
Rest easy 3 + Jackson + Tomcat + XML response
为了获得 json 响应,reseasy 定义了一种与 Jackson 集成的方法。
使用 reseasy-jackson-provider 和 resteasy-jackson2-provider。
Jackson也可以用来序列化反序列化from\toXML。即使用 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);
JAXB是将Javaclasses映射到XML的注解框架,XMLschema.To在Resteasy中使用JAXB,需要添加resteasy -jaxb-provider 到你的依赖项
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
然后,在您的回复 class 中添加 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 注释,您也可以编写自己的处理程序。
使用以下依赖项,因为 jackson-jaxrs-xml-provider
在 Jackson 2.1 之后被弃用:
<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
将被选中来完成这项工作
已创建
https://issues.jboss.org/browse/RESTEASY-1352
让我们看看它是否进入 resteasy 工件。
除了放
<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 进行测试。
为了获得 json 响应,reseasy 定义了一种与 Jackson 集成的方法。 使用 reseasy-jackson-provider 和 resteasy-jackson2-provider。
Jackson也可以用来序列化反序列化from\toXML。即使用 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);
JAXB是将Javaclasses映射到XML的注解框架,XMLschema.To在Resteasy中使用JAXB,需要添加resteasy -jaxb-provider 到你的依赖项
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
然后,在您的回复 class 中添加 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 注释,您也可以编写自己的处理程序。
使用以下依赖项,因为 jackson-jaxrs-xml-provider
在 Jackson 2.1 之后被弃用:
<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
将被选中来完成这项工作
已创建 https://issues.jboss.org/browse/RESTEASY-1352
让我们看看它是否进入 resteasy 工件。
除了放
<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 进行测试。