Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jersey can produce List<T> but cannot Response.ok(List<T>).build()?

Tags:

Jersey 1.6 can produce:

@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);     } } 

But cannot do the same with:

@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();     } } 

Giving the error: 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

This prevent the use of HTTP status code and headers.

like image 790
yves amsellem Avatar asked May 21 '11 11:05

yves amsellem


2 Answers

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>>() {     }); } 
like image 141
yves amsellem Avatar answered Oct 06 '22 03:10

yves amsellem


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();     } 
like image 39
rodrigobartels Avatar answered Oct 06 '22 02:10

rodrigobartels