0

我有以下 Jersey 方法将 HTTP 标头包装在 JavaSet<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

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

@Produces(MediaType.TEXT_HTML)

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

4

1 回答 1

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();
于 2013-10-02T21:28:16.600 回答