1

私たちのアプリケーションには、JerseyREST機能をラップするクラスがあります。1つのメソッドは、リソースからアイテムのリスト全体を取得する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;
};
4

2 に答える 2

2

この回答のようにジャクソンを使用して問題を解決しました: https://stackoverflow.com/a/9725228/1116842

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

マット・ボール 言います:

Jackson の MessageBodyReader 実装は、Jersey JSON 実装よりも行儀が良いようです。

于 2012-09-14T19:55:58.330 に答える
0

よくわかりませんが、JASON オブジェクトを期待しているのに、XML オブジェクトを取得しているようです。Stackoverflowでこれを見つけたばかりですが、あなたの問題に当てはまるのでしょうか?

安らかな Java クライアントからの JSON 出力の取得

于 2012-09-14T11:52:04.390 に答える