2011-05-21 12 views
24

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

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

Dar 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 impide que el uso de código de estado HTTP y encabezados.

+0

Aquí es la mejor solución [enter Descripción enlace aquí] [1] [1]: http: // stackoverflow.com/questions/27341788/jersey-clientresponse-getentity-of-generic-type – user3617915

Respuesta

23

Es posible incrustar un 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 tiene que utilizar las siguientes líneas para conseguir el 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>>() { 
    }); 
} 
+1

hay una pequeña trampa en esta solución es que necesita guayaba – Necronet

+0

@Necronet: no se requiere guayaba para el solución de servidor proporcionada anteriormente, ¿correcto? – Nitax

+0

@Nitax 'Lists.newArrayList' es de Guava. Puede reemplazarlo fácilmente con 'new ArrayList' y' add' en Java puro. –

8

Por alguna razón el GenericType arreglar no funcionaba de mi parte Sin embargo, dado que el borrado de tipos se realiza para las colecciones pero no para las matrices, funcionó.

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

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); 
    }); 
} 
Cuestiones relacionadas