2011-05-21 12 views
24

जर्सी 1.6 कर सकते हैं उत्पादन:जर्सी सूची <T> का उत्पादन कर सकता है लेकिन Response.ok (सूची <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); 
    } 
} 

लेकिन साथ भी ऐसा ही नहीं कर सकते हैं:

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

त्रुटि देते: 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

इस HTTP स्थिति कोड और हेडर के प्रयोग को रोकने।

+0

यहाँ सबसे अच्छा समाधान है के लिए मेरे समाधान [कड़ी यहाँ विवरण दर्ज] [1] [1]: http: // stackoverflow.com/questions/27341788/jersey-clientresponse-getentity-of-generic-type – user3617915

उत्तर

23

यह एक प्रतिक्रिया में एक 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

इस समाधान में एक छोटी सी पकड़ है कि आपको अमरूद – Necronet

+0

@ नेक्रोनेट की आवश्यकता है: गुवा के लिए जरूरी नहीं है सर्वर-साइड समाधान ऊपर प्रदान किया गया, सही? – Nitax

+0

@Nitax 'Lists.newArrayList' गुवा से है। आप इसे शुद्ध जावा में आसानी से 'नया ऐरेलिस्ट' और 'एड' के साथ बदल सकते हैं। –

8

किसी कारण से GenericType:

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

ग्राहक List<T> प्राप्त करने के लिए निम्नलिखित लाइनों का उपयोग करना ठीक से मुझसे काम नहीं कर रहा था। हालांकि, चूंकि संग्रह के लिए टाइप एरर किया जाता है लेकिन Arrays के लिए नहीं, यह काम करता है।

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

तरीकों कि 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); 
    }); 
} 
संबंधित मुद्दे