web-dev-qa-db-de.com

Ein Body-Writer für Nachrichten für die Java-Klasse Java.util.ArrayList

Beim Zugriff auf eine meiner Ressourcen von Jax-rs habe ich die folgende Stack-Ablaufverfolgung erhalten.

Ich verwende Tomcat 7 mit Jersey 1.12 und Hibernate 4 und MySQL.

Ich habe dieses Tutorial auf der Suche nach einer Lösung gefunden: 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, bei denen ich MessageBodyWriters schreibe, das sollte klappen. (Und ich weiß, dass es eine Lösung gibt, 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)
28
n4rzul

Sie müssen die Region-Klasse mit @XmlRootElement versehen.

36
Martin Matula

als schnelle lösung sehe ich:

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

Die andere Antwort funktionierte nicht für mich (ich hatte bereits die XmlRootElement-Annotation), aber ich bekam es endlich mit JSON zusammen. Es war einfach nur XML, nur nicht JSON.

Ich benutzte das Jersey-Bundle-1.17.jar (versuchte es auch mit dem ASM-3.1.jar und dem Jersey-Json-1.17.jar, das zu classpath hinzugefügt wurde, und funktionierte immer noch nicht). Ich habe gerade versucht, den Zip herunterzuladen, der 12 verschiedene Gläser enthält. Nachdem ich alle 12 Gläser zu meinem Classpath hinzugefügt hatte, war ich endgültig von dem Fehler befreit und arbeitete hervorragend mit JSON.

Ich hoffe das hilft jemandem.

BEARBEITEN: Hier ist ein Link zu der Zip-Datei, die die 12 JAR-Dateien enthält: jersey-archive-1.17.Zip

8
11101101b

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

Fügen Sie einfach Folgendes hinzu: @ Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})

Auf die Anfrage, die Sie in den Header setzen, wenn Sie die Rendite in XML oder Json gewonnen haben!

2
Dante

Wie von List erwartet, können Sie Ihre Bean-Klasse mit @XmlRootElement kommentieren. Das gleiche gilt jedoch nicht für Map . Jersey verwendet intern Moxy, um die erledigten Aufgaben zu erledigen.

1
Anudeep Abraham

Abhängigkeit hinzufügen 

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${jersey-version}</version>
</dependency>
0
Vadym Vikulin