2012-06-14 9 views
28

Ich erhielt die folgende Stapel-Trace beim Zugriff auf eine meiner Jax-RS-Ressourcen.Ein Nachrichtentext-Schreiber für Java-Klasse java.util.ArrayList

Ich benutze Tomcat 7, mit Jersey 1.12 und Hibernate 4 und MySQL.

Ich fand dieses Tutorial bei der Suche nach einer Lösung: http://aruld.info/handling-generified-collections-in-jersey-jax-rs/ aber keines der aufgeführten Beispiele schien zu funktionieren.

Was fehlt mir hier?

Bitte keine Antworten, die mich schreiben , sollte dies die Box erarbeiten. (Und ich weiß, gibt es eine Lösung, ich kann es einfach nicht herausfinden.)

Hier sind alle meine Gläser:

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 

Hier ist meine Ressourcenklasse und Methode:

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

Und hier ist der 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

scheint ähnlich: http: // Stackoverflow.com/questions/5161466/how-do-ich-benutze-the-jersey-json-pojo-support –

+2

Vielen Dank. Das ist es genau! Es war eigentlich die Frage, die mein Problem löste. Ich musste den Parameter com.sun.jersey.api.json.POJOMappingFeature hinzufügen. * facepalm * – n4rzul

+0

Was ist der beste Weg, um über diese Frage jetzt zu gehen? Könnten Sie Ihren Kommentar als Antwort posten oder sollte ich diese dumme Frage einfach löschen? – n4rzul

Antwort

36

Sie müssen Region-Klasse mit @ XmlRootElement annotieren.

+0

Vielen Dank! Ich hatte schon 5 Stunden damit verbracht, mir die Haare auszureißen! –

+1

Ich kam gerade zum zweiten Mal hierher. Sie verdienen meine +1 – luigi7up

+0

http://stackoverflow.com/questions/17342218/getting-error-a-message-body-writer-for-java-class-java-util-arraylist-listjava .. können Sie das lösen? ? – user2416728

7

Die andere Antwort funktionierte nicht für mich (ich hatte bereits die XmlRootElement Annotation), aber ich habe es endlich mit JSON arbeiten. Es gab XML gut, nur nicht JSON.

Ich war das Jersey-Bundle-1.17.jar (auch mit dem ASM-3.1.jar und Jersey-Json-1.17.jar versucht, Classpath hinzugefügt und noch nicht funktioniert). Ich habe endlich versucht, die Zip herunterzuladen, die 12 verschiedene Gläser enthält. Sobald ich alle 12 Gläser zu meinem Klassenpfad hinzugefügt habe, bin ich den Fehler endlich losgeworden und arbeite großartig mit JSON zurück.

Ich hoffe, das hilft jemandem.

EDIT: Hier ist ein Link auf die ZIP-Datei, die die 12-JAR-Dateien enthält: jersey-archive-1.17.zip

+0

Irgendwie funktioniert es. Ich denke dank javax.ws.rs.ext.MessageBodyWriter Datei in jersey-server.jar/META-INF;) Es hat den Wert von "com.sun.jersey.server.impl.template.ViewableMessageBodyWriter" innerhalb – tuxSlayer

+0

+1. Genau welche 12 verschiedenen Gläser hast du hinzugefügt? Bitte, bitte erwähne sie! oder geben Sie bitte ein Beispielprojekt an. –

+0

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

2

@XmlRootElement mit dieser Anmerkung ist es möglich, JSON ou XML in Jersey auszuwählen. Vielen Dank!

Fügen Sie einfach diese zur Ruhe: @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})

Auf Antrag Sie setzen auf den Kopf, wenn Sie die Rückkehr in XML oder in json gewonnen!

-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

Welches Paket, zum Beispiel JSONArray kommen aus ? –

+0

Es kommt in java-json jar ... Es ist verfügbar unter http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm –

9

als eine schnelle Lösung, die ich sehe:

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

hinzufügen @@XmlRootElement vor Ihrer Klasse Region

1

Wie Sie Liste erwarten sind, können Sie Ihre Bean-Klasse mit @XmlRootElement mit Anmerkungen versehen. Aber das Gleiche funktioniert nicht für Map. Jersey verwendet intern Moxy, um die Arbeit zu erledigen.

0

In Abhängigkeit

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>${jersey-version}</version> 
</dependency> 
Verwandte Themen