MessageBodyWriter no encontrado para media type = application / json


Me enfrento a problemas al consumir servicios JAX-RS como JSON.

A continuación he añadido mi código.

Esta es mi clase de servicio:

//Sets the path to base URL + /hello
@Path("/hello") 
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class Hello {

    @GET
    @Produces("application/json")
    public Student getStudent() {

        Student s = new Student();
        s.first_name = "Test First Name !!!";
        s.last_name = "Test Last Name!!!";

        return s;
    }

Student clase que estoy tratando de obtener del servicio:

@XmlRootElement
public class Student implements Serializable {

    public String first_name;
    public String last_name;

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast_name() {
        return last_name;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }

    public Student()
    {
        first_name = "Fahad";
        last_name = "Mullaji";
    }
}

Web XML en el lado del servicio.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>com.vogella.jersey.first</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <!-- Register resources and providers under com.vogella.jersey.first package. -->
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.vogella.jersey.first</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> 

No se como solucionar este problema. Estoy usando SOAP UI para probar la respuesta JSON, pero supongo que no debería importar.

Muchos lugares he leído que tengo que añadir el código a continuación. Pero no se donde. No estoy usando Maven por construir.

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

El servidor está buscando la función para analizar Student el objeto a JSON, pero no es capaz de encontrar la función o el archivo jar para él. He añadido tarro de Genson, Moxy, RESTEasy y Jackson, pero creo que ese es el problema. Creo que me estoy perdiendo el mapeo en alguna parte.

Author: Fahad Mullaji, 2014-10-06

9 answers

Pude arreglarlo instalando jersey-media-json-jackson

Añade la dependencia a pom.xml

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <scope>runtime</scope>
</dependency>
 77
Author: Alicia Tang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 05:17:20

Tienes que crear un constructor vacío porque JAX-RS inicializa las clases... Su constructor no debe tener argumentos:

@XmlRootElement
public class Student implements Serializable {

    public String first_name;
    public String last_name;

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast_name() {
        return last_name;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }

    public Student()
    {
        first_name = "Fahad";
        last_name = "Mullaji";
    }


 public Student()
    {
    }
}
 44
Author: asad.qazi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 17:00:20

Estaba en la misma situación donde
- Yo estaba no usando Maven o Hormiga,
- Terminé este tutorial de Vogella en Jersey ,
- y estaba recibiendo el error MessageBodyWriter al intentar usar @Produces(MediaType.APPLICATION_JSON).

Esta respuesta de @peeskillet resuelve el problema - tienes que usar el Jackson *.archivos jar que están disponibles desde la página de descarga de FasterXML Jackson. Necesitará los archivos core así como los archivos jaxrs.

Los agregué a mi carpeta WebContent/WEB-INF/lib donde tengo mi Camiseta *.jar archivos por el tutorial anterior, e hizo el pequeño cambio a la web.archivo xml a continuación (de nuevo, como originalmente compartido por @peeskillet):

<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
    your.other.package.here, com.fasterxml.jackson.jaxrs.json 
</param-value>

La parte importante es com.fasterxml.jackson.jaxrs.json.

 16
Author: amess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:27

Descomentando el siguiente código ayudó

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

Que estaba presente en pom.xml en mi proyecto basado en maven resolvió este error para mí.

 11
Author: Saurabh Thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-30 05:04:01

A continuación debe estar en su pom.xml por encima de otras dependencias jersy / jackson. En mi caso, como a continuación jersy-client dep-cy y tengo MessageBodyWriter no encontrado para media type=application/json.

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.25</version>
</dependency>
 7
Author: omilus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 08:58:05

Bueno, no pude hacer que el proyecto web anterior funcionara. Pero seguí investigando sobre JAX-RS y me encontré con el tutorial de Stormpath. Creo que quienquiera que esté tratando de aprender cómo REST, JSON y Jersey trabajan juntos debería ver esto.

Por favor, vea los enlaces a continuación para su presentación y muestra del proyecto REST en GitHub .

Https://www.youtube.com/watch?v=sVvL12BnIyQ

Https://github.com/stormpath/todos-jersey

Ahora puedo comparar el proyecto anterior y ver lo que todas las cosas que hice mal.

 6
Author: Fahad Mullaji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-28 22:00:55

Creo que debe intentar convertir los datos a formato json. Se puede hacer usando gson lib. Prueba algo como abajo.

No lo sé es una mejor solución o no, pero podría hacerlo esto way.It me funcionó

Ejemplo: '

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response info(@HeaderParam("Accept") String accept) {
    Info information = new Info();
    information.setInfo("Calc Application Info");
    System.out.println(accept);
    if (!accept.equals(MediaType.APPLICATION_JSON)) {
        return Response.status(Status.ACCEPTED).entity(information).build();
    } else {
        Gson jsonConverter = new GsonBuilder().create();
        return Response.status(Status.ACCEPTED).entity(jsonConverter.toJson(information)).build();
    }
}
 1
Author: sajankumar vijayan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 05:49:50

Me enfrenté a un problema similar porque el constructor de este objeto estaba usando parámetros

Antes

public MakeMoneyAndGetFitWhileYouSleep(@NotNull UserDetails turkey) {...}

Después de

public MakeMoneyAndGetFitWhileYouSleep(){}

public static MakeMoneyAndGetFitWhileYouSleep getInstance (@NotNull UserDetails turkey) {...}
 0
Author: MonoThreaded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-13 01:01:44

Para superar este problema intente lo siguiente. Funcionó para mí.

Agregue la siguiente dependencia en el pom .xml

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.25</version>
</dependency>

Y asegúrese de que La clase de modelo contiene ningún constructor arg

 public Student()
    {
    }
 0
Author: Dulith De Cozta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-26 00:23:34