Cómo producir salida JSON con Jersey 1.6 usando JAXB

@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 getAllGadgets() { return Arrays.asList(new Todo[] { new Todo() }); } } 

my web.xml:

  Jersey REST Service com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages com.test  1   Jersey REST Service /rest/*  

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 progtwigción adicional. ¿Qué pasa?

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)

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.

   com.sun.jersey.api.json.POJOMappingFeature true  

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

  com.sun.jersey.api.json.POJOMappingFeature true  

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.

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 flasks 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:

   com.sun.jersey jersey-servlet 1.17.1   com.sun.jersey jersey-client 1.17.1   com.sun.jersey jersey-json 1.17.1   com.sun.jersey jersey-core 1.17.1   com.sun.jersey jersey-server 1.17.1   org.codehaus.jackson jackson-core-asl 1.9.2   org.codehaus.jackson jackson-mapper-asl 1.9.2   org.codehaus.jackson jackson-jaxrs 1.9.2   org.codehaus.jackson jackson-xc 1.9.2   org.codehaus.jettison jettison 1.1   javax.ws.rs jsr311-api 1.1.1   asm asm 3.1  

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:

   JerseyServletContainer com.sun.jersey.spi.spring.container.servlet.SpringServlet  com.sun.jersey.api.json.POJOMappingFeature true