web-dev-qa-db-fra.com

Jersey peut produire List <T> mais ne peut pas Response.ok (List <T>). Build ()?

Jersey 1.6 peut produire:

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

Mais ne peut pas faire la même chose avec:

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

Donner l'erreur: 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

Cela empêche l'utilisation du code d'état HTTP et des en-têtes.

24
yves amsellem

Il est possible d'incorporer un List<T> dans une réponse de la manière suivante:

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

Le client doit utiliser les lignes suivantes pour obtenir le 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>>() {
    });
}
25
yves amsellem

Pour une raison quelconque, le correctif GenericType ne fonctionnait pas chez moi. Cependant, étant donné que l’effacement des types est effectué pour les collections mais pas pour les tableaux, cela a fonctionné.

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

ma solution pour les méthodes qui utilisent 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);
    });
}
0
Miguel Vieira