【问题标题】:UnmarshalException when getting json array with Jersey使用 Jersey 获取 json 数组时出现 UnmarshalException
【发布时间】:2012-09-07 13:24:18
【问题描述】:

我们的应用程序有一个包装 Jersey REST 功能的类。一种方法是public <T extends Storable> List<T> retrieve(Class<T[]> pCls) throws StorageException,它被称为retrieve(Item[].class),以从资源/items(见下文)中获取整个项目列表。

来自服务器的答案是[{"price":1.0,"specialPrice":0.0,"name":"Beverage","special":false,"category":"BEVERAGE","cost":0.0,"available":false,"id":0},{"price":2.0,"specialPrice":0.0,"name":"Meal","special":false,"category":"DISH","cost":0.0,"available":false,"id":0}],这是我所期望的。

但应用程序以Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException 退出,并带有链接异常[com.sun.istack.internal.SAXParseException2; lineNumber: 1; columnNumber: 14; unexpected element (uri:"", local:"price"). Expected elements are <{}article>,<{}item>]

检索代码(客户端):

ClientResponse cr = this.resource.path(resourcePath)
                .accept(MediaType.APPLICATION_JSON_TYPE)
                .get(ClientResponse.class);

        T[] a = cr.getEntity(pCls);

资源代码(在服务器上):

@Path("/items")
public class ItemListResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response getItemList() {
        LinkedList<Item> l = new LinkedList<Item>();
        l.add(new Item(1.0, "Beverage", Category.BEVERAGE));
        l.add(new Item(2.0, "Meal", Category.DISH));
        return Response.ok(l).build();
    }
}

项目代码:

@XmlRootElement
public class Item extends Article {
    private Category category;
    private double cost;
    private boolean available;
};

【问题讨论】:

    标签: java json jersey


    【解决方案1】:

    我不太确定,但看起来您期待的是一个 JASON 对象,但得到的是一个 XML 对象。刚刚在 Stackoverflow 上找到了这个,也许它适用于您的问题?

    Getting JSON out put from restful java client

    【讨论】:

    • 不,抱歉。如上所述,来自服务器的响应与预期一样。
    【解决方案2】:

    我在这个答案中使用 Jackson 解决了这个问题:https://stackoverflow.com/a/9725228/1116842

    ClientConfig cfg = new DefaultClientConfig();
    cfg.getClasses().add(JacksonJsonProvider.class);
    Client client = Client.create(cfg);
    

    马特·鲍尔说:

    Jackson 的 MessageBodyReader 实现似乎比 Jersey JSON 实现更好。

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多