web-dev-qa-db-ja.com

ジャージーはList <T>を生成できますが、Response.ok(List <T>)。build()を生成できませんか?

Jersey 1.6は以下を生成できます。

@Path("/stock")
public class StockResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Stock> get() {
        Stock stock = new Stock();
        stock.setQuantity(3);
        return Lists.newArrayList(stock);
    }
}

しかし、以下と同じことはできません:

@Path("/stock")
public class StockResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response get() {
        Stock stock = new Stock();
        stock.setQuantity(3);
        return Response.ok(Lists.newArrayList(stock)).build();
    }
}

エラーを与える:A message body writer for Java class Java.util.ArrayList, and Java type class Java.util.ArrayList, and MIME media type application/json was not found

これにより、HTTPステータスコードとヘッダーの使用が防止されます。

24
yves amsellem

次の方法でList<T>をResponseに埋め込むことができます。

@Path("/stock")
public class StockResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response get() {
        Stock stock = new Stock();
        stock.setQuantity(3);

        GenericEntity<List<Stock>> entity = 
            new GenericEntity<List<Stock>>(Lists.newArrayList(stock)) {};
        return Response.ok(entity).build();
    }
}

クライアントは次の行を使用してList<T>を取得する必要があります。

public List<Stock> getStockList() {
    WebResource resource = Client.create().resource(server.uri());
    ClientResponse clientResponse =
        resource.path("stock")
        .type(MediaType.APPLICATION_JSON)
        .get(ClientResponse.class);
    return clientResponse.getEntity(new GenericType<List<Stock>>() {
    });
}
25
yves amsellem

何らかの理由で、GenericTypeの修正が機能しませんでした。ただし、型の消去はコレクションでは行われますが、配列では行われないため、これは機能しました。

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Response getEvents(){
        List<Event> events = eventService.getAll();
        return Response.ok(events.toArray(new Event[events.size()])).build();
    }
8
rodrigobartels

asyncResponseを使用するメソッドの私のソリューション

@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void list(@Suspended
        final AsyncResponse asyncResponse) {
    asyncResponse.setTimeout(10, TimeUnit.SECONDS);
    executorService.submit(() -> {
        List<Product> res = super.listProducts();
        Product[] arr = res.toArray(new Product[res.size()]);
        asyncResponse.resume(arr);
    });
}
0
Miguel Vieira