Jersey can produce List<T> but cannot Response.ok(List<T>).build()?
It is possible to embed a List<T>
in a Response the following way:
@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(); }}
The client have to use the following lines to get the 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>>() { });}
For some reason the GenericType fix wasn't working from me. However, since type erasure is done for Collections but not for Arrays, this worked.
@GET @Produces(MediaType.APPLICATION_XML) public Response getEvents(){ List<Event> events = eventService.getAll(); return Response.ok(events.toArray(new Event[events.size()])).build(); }
my solution for methods that use 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); });}