java - servicios - Cómo producir salida JSON con Jersey 1.6 usando JAXB
response json java rest (6)
@XmlRootElement
public class Todo {
private String s = "test";
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
}
y servicio:
@Path("/test")
public class Service {
@GET
@Produces({MediaType.APPLICATION_JSON })
public List<Todo> getAllGadgets() {
return Arrays.asList(new Todo[] { new Todo() });
}
}
my web.xml:
<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.test</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>
Todo esto funciona si configuro MediaType.APPLICATION_XML para producir una anotación. Pero para JSON obtengo la siguiente excepción:
SEVERE: excepción asignada a la respuesta: 500 (Internal Server Error) javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: un mensaje cuerpo escritor para Java clase java.util.Arrays $ ArrayList y Java tipo java .util.List y la aplicación / json del tipo de medio MIME no se encontró
Uso Jersey 1.6 y, según el tutorial, el formato JSON debería funcionar con JAXB sin ninguna programación adicional. ¿Qué pasa?
Agregue el siguiente parámetro al servlet jersey en el archivo web.xml, esto es necesario para las últimas versiones 1.x de jersey-servlet.
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
La excepción del escritor del cuerpo del mensaje enumerada por el OP se generará si no anota su POJO (o POJO base) con @XmlRootElement
.
Por ejemplo:
@XmlRootElement
public class BaseBean
{
private Boolean success = Boolean.TRUE;
private String message;
/**
* Empty constructor to satisfy requirements of JAXRS.
*/
public BaseBean() {}
/**
* Returns a simple message to accompany the success/failure.
* @return
*/
public String getMessage()
{
return message;
}
/**
* Sets the message (if required).
* @param message
*/
public void setMessage(String message)
{
this.message = message;
}
/**
* Returns a flag indicating whether a request for content was
* successful.
* @return
*/
public Boolean getSuccess()
{
return success;
}
/**
* Marks the success of a request for content.
* @param success
*/
public void setSuccess(Boolean success)
{
this.success = success;
}
}
La respuesta de Kamran funcionó para mí, solo para ampliar más en el xml:
<servlet>
<servlet-name>JerseyServletContainer</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Las otras respuestas no funcionaron para mí, pero finalmente lo conseguí para trabajar con JSON.
Estaba usando jersey-bundle-1.17.jar (también intenté con asm-3.1.jar y jersey-json-1.17.jar agregado a classpath y todavía no funcionó). Finalmente intenté descargar el zip que incluye 12 frascos diferentes. Una vez que agregué los 12 jar a mi classpath, finalmente me deshice del error y funcionó muy bien al regresar a JSON.
Espero que esto ayude a alguien.
Actualización: Aquí hay un enlace al archivo comprimido que contiene los 12 archivos jar: jersey-archive-1.17.zip
Otra actualización para usuarios de Maven: agregue lo siguiente a su pom.xml para obtener los 12 jar por separado:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.1</version>
</dependency>
Resolví esto. Todo lo que tenía que hacer era agregar la biblioteca jersey-json-1.6.jar al proyecto (esto no es una parte obligatoria de la camiseta)
Yo uso Google App Engine y también he tenido problemas con esto, si usas jersey-bundle-1.17.jar la mayoría de las cosas funcionan hasta que agregues
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
recibirás muchos mensajes extraños. Esto se debe a que echas de menos algunos tarros de jackson. Si vas a la página de inicio de Jersey y descargas el zip y el paquete. Simplemente suelta el paquete y desde el archivo zip necesitas agregar los 4 jars de jackson en tu classpath y deberías hacer que todo funcione sin ningún error.
Al agregar jackson-jaxrs-1.9.2.jar se resuelve este error a continuación
SEVERE: The registered message body writers compatible with the MIME media type are:
application/json ->
Al agregar jackson-xc-1.9.2.jar se resuelve este conflicto a continuación
java.lang.NoClassDefFoundError: org / codehaus / jackson / xc / JaxbAnnotationIntrospector
Espero que esto ayude a alguien.