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

25,631

Solution 1

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

Solution 2

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();
    }
Share:
25,631
yves amsellem
Author by

yves amsellem

Jongo developer — Query in Java as in Mongo shell

Updated on July 14, 2022

Comments

  • yves amsellem
    yves amsellem almost 2 years

    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.