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) {...}