/ / Impossibile produrre JSON - javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException - json, rest, maven, jersey

Impossibile produrre JSON - javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException - json, rest, maven, jersey

Sto usando Jersey 1.15, JDK 1.6, Tomcat 7, Maven 2.2.1 per creare un semplice servizio Web riposante che dovrebbe restituire una stringa JSON da un POJO che ho mappato.

Ecco la mia pojo:

package com.myservice.domain;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Person {
private String firstName;
private String lastName;

// Getters & Setters
}

il mio servizio web:

package com.myservice.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.myservice.domain.Person;

@Path("/service")
public class MyService {

@GET
@Path("showPerson")
@Produces(MediaType.APPLICATION_JSON)
public Person getPerson() {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
return person;
}
}

Ecco il mio pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.myservice</groupId>
<artifactId>myservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>My Web Service</name>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.15</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.15</version>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.15</version>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.14</version>
</dependency>

<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.14</version>
</dependency>

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.9</version>
</dependency>
</dependencies>

<build>
<finalName>myservice</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

Il mio web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<display-name>My Web Service</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.myservice.resource</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>

Dopo la distribuzione su Tomcat, quando provo a richiamare il servizio Web in questo modo:

curl -X GET http://localhost:8080/myservice/rest/service/showPerson

Ottengo il seguente errore:

Nov 20, 2012 10:40:06 AM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java class com.myservice.domain.Person,
and Java type class com.myservice.domain.Person,
and MIME media type application/json was not found

Nov 20, 2012 10:40:06 AM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: A message body writer for Java class com.myservice.domain.Person,
and Java type class com.myservice.domain.Person, and MIME media type
application/json was not found

Nov 20, 2012 10:40:06 AM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: The registered message body writers compatible with the
MIME media type are: */* ->

com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.StreamingOutputProviderfg
com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General

Nov 20, 2012 10:40:06 AM com.sun.jersey.spi.container.ContainerResponse
write

SEVERE: The registered message body writers compatible with the
MIME media type are:
*/* ->

com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General

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
com.myservice.domain.Person,
and Java type class com.myservice.domain.Person,
and MIME media type application/json was not found

com.sun.jersey.api.MessageException:

A message body writer for Java class com.myservice.domain.Person,
and Java type class com.myservice.domain.Person, and MIME media type
application/json was not found

HTTP Status 500 - Internal Server Error
The server encountered an internal error that prevented it from
fulfilling this request.

Dopo aver setacciato Internet, ho provato a inserire la seguente soluzione proposta che tutti hanno suggerito in web.xml:

<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>

Ma mi dà ancora lo stesso problema! Tuttavia, restituisce i dati corretti di cui è stato eseguito il marshalling in XML se utilizzo APPLICATION_XML.

Apprezzerei davvero se qualcuno mi indicasse la giusta direzione.

Grazie mille per aver dedicato del tempo a leggere questo.

risposte:

7 per risposta № 1

Inserisci Genson libreria nelle tue dipendenze. Abiliterà automaticamente l'associazione dati JSON-POJO.


1 per risposta № 2

Aggiungi jersey-json alle tue dipendenze. Aggiungerà un'implementazione della serializzazione JSON.

Aggiungi questo a pom.xml

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.8</version>
</dependency>