2012-06-14 7 views
28

Otrzymałem poniższy ślad stosu podczas uzyskiwania dostępu do moich zasobów jax-rs.Kreator treści wiadomości dla klasy Java java.util.ArrayList

Używam Tomcat 7, z Jersey 1.12 i Hibernate 4 i MySQL.

Znalazłem ten samouczek podczas szukania rozwiązania: http://aruld.info/handling-generified-collections-in-jersey-jax-rs/, ale żaden z wymienionych przykładów nie działał.

Czego mi tu brakuje?

Proszę nie odpowiadać, że mam pisać , powinno to działać poprawnie. (I wiem, że istnieje rozwiązanie, po prostu nie mogę zrozumieć.)

Oto wszystkie moje słoiki:

antlr-2.7.7.jar 
asm-3.1.jar 
commons-collections-3.2.1.jar 
dom4j-1.6.1.jar 
gson-1.7.1.jar 
hibernate-commons-annotations-4.0.1.Final.jar 
hibernate-core-4.1.0.Final.jar 
hibernate-jpa-2.0-api-1.0.1.Final.jar 
jackson-core-asl-1.9.2.jar 
jackson-jaxrs-1.9.2.jar 
jackson-mapper-asl-1.9.2.jar 
jackson-xc-1.9.2.jar 
javassist-3.15.0-GA.jar 
jboss-logging-3.1.0.CR2.jar 
jboss-transaction-api_1.1_spec-1.0.0.Final.jar 
jersey-client-1.12.jar 
jersey-core-1.12.jar 
jersey-json-1.12.jar 
jersey-server-1.12.jar 
jersey-servlet-1.12.jar 
jettison-1.1.jar 
jsr311-api-1.1.1.jar 
mysql-connector-java-3.1.12-bin.jar 

Oto moja klasa zasobów i metoda:

@Path("/region") 
public class RegionService { 
    // This method is called if TEXT_PLAIN is request 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public JResponse<List<Region>> region() { 
     RegionDao regionDao = new RegionDao(); 
     regionDao.openSession(); 
     List<Region> regions = regionDao.getAll(); 
     regionDao.closeSession(); 
     return JResponse.ok(regions).build(); 
    } 
} 

a oto StackTrace:

SEVERE: Mapped exception to response: 500 (Internal Server Error) 
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<campher.hibernate.entities.Region>, and MIME media type application/json was not found 
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1451) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414) 
+5

Wydaje podobna: http: // stackoverflow.com/questions/5161466/how-do-i-use-the-jersey-json-pojo-support –

+2

Wielkie dzięki. Dokładnie to !! To właśnie było pytanie, które rozwiązało mój problem. Musiałem dodać parametr com.sun.jersey.api.json.POJOMappingFeature. * facepalm * – n4rzul

+0

Jaki jest najlepszy sposób, aby przejść teraz do tego pytania? Czy mógłbyś zamieścić swój komentarz jako odpowiedź, czy też powinienem po prostu całkowicie usunąć to głupie pytanie? – n4rzul

Odpowiedz

36

trzeba opisywanie klasy regionem @XmlRootElement.

+0

Dziękujemy! Spędziłem już 5 godzin, wyciągając włosy z tego! –

+1

Właśnie przyjechałem tutaj po raz drugi. Zasługujesz na moje +1 – luigi7up

+0

http://stackoverflow.com/questions/17342218/getting-error-a-message-body-writer-for-java-class-java-util-arraylist-listjava .. możesz rozwiązać ten problem? ? – user2416728

7

Druga odpowiedź nie działa dla mnie (miałem już adnotację XmlRootElement), ale w końcu udało mi się ją obsłużyć z JSON. To zwracało XML w porządku, po prostu nie JSON.

Użyłem pakietu jersey-bundle-1.17.jar (również wypróbowany z plikiem asm-3.1.jar i jersey-json-1.17.jar dodanym do ścieżki klasy i nadal nie działał). W końcu po prostu próbowałem pobrać zip, który zawiera 12 różnych słoików. Kiedy dodałem wszystkie 12 słoików do mojej ścieżki klasy, w końcu pozbyłem się błędu i pracowałem świetnie, zwracając JSON.

Mam nadzieję, że to pomoże komuś.

EDIT: Tutaj jest link do pliku zip, który zawiera pliki jar 12: jersey-archive-1.17.zip

+0

Jakoś to działa. Myślę, że dzięki plik javax.ws.rs.ext.MessageBodyWriter w jersey-server.jar/META-INF;) Ma wartość "com.sun.jersey.server.impl.template.ViewableMessageBodyWriter" wewnątrz – tuxSlayer

+0

+1. Dokładnie jakie? 12 różnych słoików zostało dodanych? Uprzejmie proszę o nich! lub daj przykładowy projekt, proszę. –

+0

Oczywiście, http://repo1.maven.org/maven2/com/sun/jersey/jersey-archive/1.17.1/jersey-archive-1.17.1.zip – 11101101b

2

@XmlRootElement z tej adnotacji jest to możliwe, aby wybrać JSON ou XML w Jersey. Dziękuję bardzo!

Wystarczy dodać do odpoczynku to: @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})

Na życzenie ustawionej w nagłówku jeśli wygrał zwrotu w XML lub JSON!

-1
You can use JSONObject to create a Json Response 

    eg: 

    List<Region> regions = regionDao.getAll(); 
    JSONArray list = new JSONArray(); 
    for(Region region : regions) 
    { 
     JSONObject jObject= new JSONObject(); 
     //put all the data in json object 
     jObject.put(region.getSomething()); 
     // and put this Jsonobject in JsonArray 
     list.add(jObject); 
    } 

Or 

Response.ok().entity(new GenericEntity<List<Region>>(regions) {}).build(); 
+0

jaki pakiet ma, na przykład JSONArray pochodzi z ? –

+0

Jest dostarczany w słoiku Javy JSON ... Jest dostępny pod adresem http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm –

9

jako szybkie rozwiązanie widzę:

final List<MyModel> myList = new ArrayList<>(); 
Response.ok().entity(new GenericEntity<List<MyModel>>(myList) {}).build(); 
-2

dodać @@XmlRootElement przed klasą Region

1

Jak spodziewasz listy można opisywać swoją klasę Bean z @XmlRootElement. Ale to samo nie zadziała w Mapie. Jersey wewnętrznie używa moxy, aby wykonać zadanie.

0

Dodaj zależnościami

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>${jersey-version}</version> 
</dependency> 
Powiązane problemy