休息轻松3 + Jackson + Tomcat + XML响应

时间:2016-05-04 17:26:30

标签: java xml tomcat jackson resteasy

为了获得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);

3 个答案:

答案 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的测试。