usar intellij idea gui codigo java json jaxb jersey generic-list

java - codigo - intellij idea gui builder



Jersey puede producir la Lista<T> pero no puede Response.ok(Lista<T>).build()? (3)

Es posible incrustar una List<T> en una Respuesta de la siguiente manera:

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

El cliente debe usar las siguientes líneas para obtener la 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>>() { }); }

Jersey 1.6 puede producir:

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

Pero no se puede hacer lo mismo con:

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

Dando el 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

Esto evita el uso del código de estado HTTP y los encabezados.


Mi solución para los métodos que utilizan 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); }); }


Por alguna razón, la solución GenericType no funcionaba de mi parte. Sin embargo, dado que el borrado de tipo se realiza para Colecciones pero no para Arrays, esto funcionó.

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