【问题标题】:How to return an object with HTML or XML MIME types in Jersey?如何在 Jersey 中返回具有 HTML 或 XML MIME 类型的对象?
【发布时间】:2013-10-01 18:42:35
【问题描述】:

我有以下 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

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

@Produces(MediaType.TEXT_HTML)

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

【问题讨论】:

  • 那是因为你的 marshaller 无法映射 Set,尝试返回 String[],我在使用 jackson 库时遇到了这种问题
  • @EugenHalca 我尝试返回 String[] 但仍然遇到同样的错误。

标签: java xml rest jersey


【解决方案1】:

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

@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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多