MessageBodyWriter не найден для типа media = application/json

Я столкнулся с проблемами при использовании JAX-RS-сервисов как JSON.

Ниже я добавил свой код.

Это мой класс обслуживания:

//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 класс, который я пытаюсь получить от службы:

@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";
    }
}

Веб-XML со стороны службы.

<?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> 

Я не знаю, как исправить эту проблему. Я использую SOAP UI для тестирования ответа JSON, но думаю, что это не имеет значения.

Во многих местах, которые я прочитал, мне нужно добавить код ниже. Но я не знаю, где. Я не использую Maven для строительства.

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

Сервер ищет функцию для синтаксического анализа объекта Student для JSON, но он не может найти для него файл функции или jar. Я добавил банку Генсона, Мокси, RESTEasy и Jackson, но я думаю, что проблема. Я думаю, что мне где-то не хватает карты.

Ответ 1

Ну, я не мог заставить этот веб-проект работать. Но я продолжал проводить исследования на JAX-RS, и я наткнулся на учебник Stormpath. Я думаю, что тот, кто пытается узнать, как работают REST, JSON и Джерси, должен следить за этим.

Пожалуйста, см. ссылки ниже для их презентации и образец проекта REST на GitHub.

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

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

Теперь я могу сравнить выше проект и посмотреть, что все, что я сделал неправильно.

Ответ 2

Я смог исправить это, установив jersey-media-json-jackson

Добавьте зависимость к pom.xml

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <scope>runtime</scope>
</dependency>

Ответ 3

Вы должны создать пустой конструктор, потому что JAX-RS инициализирует классы... У вашего конструктора не должно быть аргументов:

@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()
    {
    }
}

Ответ 4

Я был в той же ситуации, когда - Я был не, используя Maven или Ant,
- Я закончил этот учебник Vogella на Джерси,
- и при попытке использовать @Produces(MediaType.APPLICATION_JSON) я получал ошибку MessageBodyWriter.

Этот ответ от @peeskillet решает проблему - вам нужно использовать файлы Jackson *.jar, доступные из страница загрузки FasterXML Jackson. Вам понадобятся файлы core, а также файлы jaxrs.

Я добавил их в мою папку WebContent/WEB-INF/lib, где у меня есть файлы Джерси *.jar в приведенном выше учебнике, и сделал небольшое изменение в файле web.xml ниже (опять же, как первоначально было разделено на @peeskillet):

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

Важной частью является com.fasterxml.jackson.jaxrs.json.

Ответ 5

Раскомментирование приведенного ниже кода помогло

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

который присутствовал в pom.xml в моем проекте на основе maven, разрешил эту ошибку для меня.

Ответ 6

Ниже должно быть в вашем pom.xml выше других зависимостей jersy/jackson. В моем случае это как ниже jersy-client dep-cy и я получил MessageBodyWriter не найден для типа media = application/json.

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

Ответ 7

Я думаю, вам стоит попробовать конвертировать данные в формат json. Это можно сделать, используя gson lib. Попробуйте что-то вроде ниже.

Я не знаю, что это лучшие решения или нет, но вы могли бы сделать это так. Это сработало для меня.

пример: `

@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();
    }
}

Ответ 8

У меня возникла аналогичная проблема, потому что конструктор этого объекта использовал параметры

Перед

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

После

public MakeMoneyAndGetFitWhileYouSleep(){}

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