如何在Jersey中返回HTML或XML MIME类型的对象?

时间:2013-10-01 18:42:35

标签: java xml rest jersey

我有以下Jersey方法将HTTP标头包装在Java Set<String>对象中。

@GET
@Path("header-info")
@Produces(MediaType.TEXT_XML)
public Response getAllHeaders() {
    Map<String, List<String>> headerMap = headers.getRequestHeaders();
    Set<String> headerNames = headerMap.keySet();
    Set<String> values = new HashSet<String>();
    for(String header : headerNames){
        String headerValue = headerMap.get(header).get(0);
        values.add(headerValue);
    }
    return Response.status(200).entity(values).build();
}

我想以XML或HTML MIME类型返回字符串集。但是当我访问链接时,我收到错误

A message body writer for Java class java.util.HashSet, and Java type class java.util.HashSet, and MIME media type text/xml was not found

我想这是因为Response Set<String> values中返回的对象没有XML的消息体编写器。如果我使用HTML MIME类型,则会发生同样的错误:

@Produces(MediaType.TEXT_HTML)

我注意到Jersey中有一个MessageBodyWriter接口可以将任何对象写入XML。但是我需要实现这个接口来写入XML。我还需要再次实现它来写入HTML。有没有一种快速简便的方法可以在Jersey中直接将Java对象序列化为XML和HTML?

1 个答案:

答案 0 :(得分:0)

首先,尝试将响应内容类型注释更新为:

@Produces(MediaType.APPLICATION_XML).

然后,您需要使用JAXB注释您的实体,以便Jersey知道如何将其编组为XML。尝试创建一个带JAXB注释的包装器,例如:

@XmlRootElement(name="set")
public class JaxbSet<T> implements Set<T> {
    protected Set<T> set;
    public JaxbSet(Set<T> set){
        this.set=set;
    }
    @XmlElement(name="item")
    public Set<T> getSet(){
        return this;
    }
}

然后将此包装器作为响应实体传递:

return Response.status(200).entity(new JaxbSet<String>(values)).build();