私たちのアプリケーションには、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;
};