休息是不是支持对象的arraylist?

Posted

技术标签:

【中文标题】休息是不是支持对象的arraylist?【英文标题】:Does rest supports arraylist of objects?休息是否支持对象的arraylist? 【发布时间】:2013-07-09 13:31:48 【问题描述】:

我有一个类 BookMain,它返回一个对象数组列表。我正在使用 REST 服务获取输出,但出现错误。

这是我的 BookMain 类:

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_XML)
public ArrayList<Object> addObjects() 

    Book book = new Book(); 
    book.setName("The Book");
    book.setAuthor("Author");

    BookStore bookstore = new BookStore();
    bookstore.setName("The Bookstore");
    bookstore.setLocation("UK");

    ArrayList<Object> list = new ArrayList<Object>();
    list.add(book);
    list.add(bookstore);

    return list;   

这是我得到的错误:

11 Jul, 2013 3:36:52 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java class java.util.ArrayList, and Java type java.util.ArrayList<java.lang.Object>, and MIME media type application/xml was not found 11 Jul, 2013 3:36:52 PM com.sun.jersey.spi.container.
ContainerResponse write SEVERE: The registered message body writers 
compatible with the MIME media type are:application/xml ->
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$App
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App

谁能给我一个解决方案?

【问题讨论】:

您的输出页面的内容类型似乎是application/xml,所以您应该将ArrayList 序列化为xml 发回? 以下内容可以帮助你,A message body writer for Java class java.util.ArrayList…and MIME media type text/xml was not found 【参考方案1】:

您需要将您的实体(Arraylist)包装在 Response 对象下。此外,您的休息方法返回类型应该是响应。以下是您需要做的:

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_XML)
public Response addObjects() 

    Book book = new Book(); 
    book.setName("Here is the Game");
    book.setAuthor("HHH");

    BookStore bookstore = new BookStore();
    bookstore.setName("Prateek Bookstore");
    bookstore.setLocation("Vasanth Nagar");

    ArrayList<Object> list = new ArrayList<Object>();
    list.add(book);
    list.add(bookstore);

    return Response.status(200).entity(list).build();

还要在 ResponseList bean 的 getter 顶部添加 @XmlElement

@XmlRootElement
public class ResponseList 

private ArrayList<Object> list;

@XMLElement("booksList")
public ArrayList<Object> getList() 
    return list;


public void setList(ArrayList<Object> list) 
    this.list = list;
   

【讨论】:

执行此操作时出现以下错误:方法状态(int)未定义类型响应。有什么想法吗? 从哪个包中导入了 'Response' 类? @pWoz import com.sun.research.ws.wadl.Response; 试试这个:javax.ws.rs.core.Response @pWoz 这个正在工作,但我仍然遇到我在问题中提到的相同错误,它没有得到解决【参考方案2】:

如下引入一个新类

@XmlRootElement(name = "responseList")
public class ResposeList 

    private List<Object> list;

    public List<Object> getList() 
        return list;
    

    public void setList(List<Object> list) 
        this.list = list;
    


并设置如下列表

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_XML)
public ResposeList addObjects() 

    Book book = new Book(); 
    book.setName("Here is the Game");
    book.setAuthor("HHH");

    BookStore bookstore = new BookStore();
    bookstore.setName("Prateek Bookstore");
    bookstore.setLocation("Vasanth Nagar");

    ArrayList<Object> list = new ArrayList<Object>();
    list.add(book);
    list.add(bookstore);
    ResposeList books=new ResposeList();
    books.setList(list);

    return books;   

【讨论】:

嘿伙计,我不想在我的项目中引入一个新类。里面已经有50-60个班了。如果我引入一个新类来实现这一点,我需要再引入大约 20 个类。有没有办法在不引入新类的情况下解决这个问题?? 嘿,我编辑了答案。现在你只能在你返回列表的任何地方使用这个类 我想通了,我们需要使用 XmlSeeAlso 注释在响应列表类中包含子类 感谢您宝贵的时间:) @Prats Ahh 是的,您需要将 classesToBeBound 属性定义为 Jaxb2Marshaller 的列表。无论如何,很高兴它可以工作 :)【参考方案3】:

您可以简单地使用 JSONArray 来显示结果。 创建一个 JSONArray 对象并将列表传递给 JSONArray() 构造函数。 然后以字符串格式返回 JSONArray 对象。 将方法的返回类型更改为 String,以下代码将起作用。

块引用

JSONArray a=new JSONArray(list); 返回 a.toString();

【讨论】:

以上是关于休息是不是支持对象的arraylist?的主要内容,如果未能解决你的问题,请参考以下文章

Arrays$ArrayList 的 Object 对象转换为 List<Object> 对象的技巧

8 arraylist

何时在 c# 中使用 ArrayList 而不是 array[]?

Java 性能 - ArrayLists 与 Arrays 的大量快速读取

Java如何正确的将数值转化为ArrayList?

Array和ArrayList的异同点