当前位置: 首页 > 知识库问答 >
问题:

Java类java.util.ArrayList的消息体编写器...找不到MIME媒体类型text/xml

公西嘉玉
2023-03-14

我正在使用Jersey构建REST服务,并希望返回一个< code >集合

@GET
@Produces(MediaType.TEXT_XML)
@Path("/directgroups")
public Response getDirectGroupsForUser(@PathParam("userId") String userId) {
    try {
        Collection<String> result = service.getDirectGroupsForUser(userId, null, true);

//      return result; //first try
//      return result.toArray(new String[0]); //second try
        return Response.ok().type(MediaType.TEXT_XML).entity(result).build(); //third try
    } catch (UserServiceException e) {
        LOGGER.error(e);
        throw new RuntimeException(e.getMessage());
    }
}

但我的尝试失败了,但有以下例外:

javax.ws.rs.WebApplicationException:com.sun.jersey.api。MessageException:Java类Java.util的消息体编写器。ArrayList和Java类型类Java.util。找不到ArrayList和MIME媒体类型text/xml

我通过谷歌找到的那个异常的所有结果都处理了返回文本/ json而不是文本/ xml,就像我的情况一样。

有人能帮我吗?我想,如果我使用一个响应,那将是我在XML中的根元素,我的集合是一个字符串元素列表..

共有3个答案

张和豫
2023-03-14

到目前为止,对我有效的唯一方法是创建我自己的包装对象。

不要忘记解释JAXB如何解析它的@XmlRootElement注释。

请注意,这适用于任何类型的对象——在这个例子中,我使用了字符串的ArrayList。

例如

包装器对象应如下所示:

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class ArrayListWrapper {
    public ArrayList<String> myArray = new ArrayList<String>();
}

REST方法应该如下所示:

@GET
@Produces(MediaType.TEXT_XML)
@Path("/directgroups")
public ArrayListWrapper getDirectGroupsForUser(@PathParam("userId") String userId) {
    try {
        ArrayListWrapper w = new ArrayListWrapper();
        w.myArray = service.getDirectGroupsForUser(userId, null, true);
        return w;
    } catch (UserServiceException e) {
        LOGGER.error(e);
        throw new RuntimeException(e.getMessage());
    }
}
白越
2023-03-14

注意:虽然这个答案有效,但anar的答案更好。

您应该尝试使用JAXB注释类来解决您的问题。您可以将您的方法更改为:

@GET
@Produces(MediaType.TEXT_XML)
@Path("/directgroups")
public Groups getDirectGroupsForUser(@PathParam("userId") String userId) {
    try {

        Groups groups = new Groups();
        groups.getGroup().addAll(service.getDirectGroupsForUser(userId, null, true));
        return groups;
    } catch (UserServiceException e) {
        LOGGER.error(e);
        throw new RuntimeException(e.getMessage());
    }
}

然后为您的组创建一个JAXB注释类。我已经为您包含了一个生成的类,它使用了这个答案中描述的过程。以下是它将生成的文档示例

<groups>
  <group>Group1</group>
  </group>Group2</group>
</groups>

下面是生成的类:

package example;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{}group" maxOccurs="unbounded"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "group"
})
@XmlRootElement(name = "groups")
public class Groups {

    @XmlElement(required = true)
    protected List<String> group;

    /**
     * Gets the value of the group property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the group property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getGroup().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link String }
     * 
     * 
     */
    public List<String> getGroup() {
        if (group == null) {
            group = new ArrayList<String>();
        }
        return this.group;
    }

}
骆昊阳
2023-03-14

使用

List<String> list = new ArrayList<String>();
GenericEntity<List<String>> entity = new GenericEntity<List<String>>(list) {};
Response response = Response.ok(entity).build();

泛型实体包装器用于在使用响应生成器时获取输出。

参考

 类似资料:
  • 问题内容: 我正在使用Jersey来构建REST服务,并希望返回XML。 但是我的尝试失败,但有以下异常: javax.ws.rs.WebApplicationException:com.sun.jersey.api.MessageException:Java类java.util.ArrayList和Java类型类java.util.ArrayList和MIME媒体类型text / xml的消息正

  • 问题内容: 我正在测试RESTful服务,当我执行RESTful服务时,尽管我的类路径(WEB-INF / lib)中包含以下jar,但是却遇到异常,但我没有使用Maven,而我的JDK版本是1.5。有关此问题的其他问题无助于解决问题。 程式码片段 web.xml 罐子清单 异常堆栈 我该如何解决这个问题? 问题答案: 确保您的项目中没有多个Jersey版本。在您提供的列表中,有3个不同版本(1.

  • 我正在使用jersey客户端调用rest webservice。 我的网络服务正在使用json,所以我需要让json打电话给我的网络服务提供商。 我用下面的方法做这件事。 但是我得到了以下异常: 09:52:01,625错误[[MVC-dispatcher]]servlet MVC-dispatcher的Servlet.service()抛出异常com . sun . jersey . API .

  • 问题内容: 在尝试找出我的问题之后,我终于决定问您如何解决我的问题。我见过不同的人有相同的问题,我尝试了所有建议他们做的事情,但没有任何帮助解决我的问题。所以基本上我有一个使用Jersey进行构建的RESTful服务。对于我的客户,我想返回JSON格式的对象。我通读了不同的教程,并决定使用jersey- json-1.8库是有意义的。我像往常一样将所有内容添加到我的项目中,并尝试运行它,但是每次调

  • 最初设计MIME(多用途Internet邮件扩展)媒体类型,以便电子邮件可以包括除纯文本之外的信息。 MIME媒体类型表示以下内容 - 消息的不同部分(如文本和附件)如何组合到消息中。 指定消息的每个部分的方式。 编码不同项目以进行传输的方式,以便即使设计为仅使用ASCII文本的软件也可以处理该消息。 现在MIME类型不只是用于电子邮件; 它们已经被Web服务器采用,作为告诉Web浏览器向他们发送

  • 我在我的tomcat日志中看到以下错误... 未找到 Java 类的邮件正文读取器和 Java 类型类“多部分”和“表”多部分“和”MIME 媒体类型多部分/表单数据“。与 MIME 媒体类型兼容的已注册邮件正文读取器包括:/ - 在客户端,我看到以下消息: 邮政https://dev.project.org/upload返回了415不支持的媒体类型的响应状态。 我已经搜索了一下,建议是球衣多部分