2014-10-05 3 views
40

У меня проблемы с потреблением услуг JAX-RS как JSON.MessageBodyWriter не найден для носителя type = application/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"; 
    } 
} 

Web 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, но он не может найти функцию или банку файл для него. Я добавил банку Генсона, Мокси, RESTEasy и Джексона, но я думаю, что это проблема. Я думаю, что мне где-то не хватает карты.

+0

Как вы строите? –

+0

Я следил за http://www.vogella.com/tutorials/REST/article.html. Он ничего не говорил о строительстве службы MAVEN или ANT. Должен ли я использовать что-либо для строительства. Спасибо за ответ. –

ответ

6

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

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

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

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

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

71

я был в состоянии исправить это установить джерси-медиа-JSon-Джаксон

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

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

Спасибо! Другие, не забудьте добавить «версию». – asgs

+4

Выберите последнюю версию '' ': https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson –

+2

Почему это решение работает. Почему я должен просто вставить это в мой жук вслепую. – orange14

15

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

This answer от @peeskillet решает проблему - Вы должны использовать файлы Jackson * .jar, доступные из the FasterXML Jackson Download page. Вам нужны файлы core, а также файлы jaxrs.

Я добавил их в свою папку WebContent/WEB-INF/lib, где у меня есть мои файлы * .jar на Джерси в приведенном выше учебнике, и сделал небольшое изменение в Интернете.файл 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.

+0

. Я думаю, что у меня такая же проблема, которую мне нужно исправить, но я не уверен, что «ваш.other.package.here» означает? – jsh6303

+0

Название пакета или пакетов, в которых определены ваши контроллеры и конечные точки Java. Например, у меня может быть пакет «login» с классом внутри маршрутов для входа в систему. Итак, «your.other.package.here» будет «login» – amess

+0

Вы, сэр, заслуживаете трофея.Благодарим вас за упоминание части: your.other.package.here, com.fasterxml.jackson.jaxrs.json Это было именно то, чего я не хватало. –

11

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

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

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

35

Вы имеете создать пустой конструктор, потому что 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

У меня такая же проблема с моим кодом и разрешена добавлением пустого конструктора –

+2

Brilliant! Почему это не тот признанный ответ, находится вне меня. –

+1

Это должен быть правильный ответ. В любом случае, не возражаете ли вы объяснить, зачем нужен пустой конструктор? – dkonayuki

1

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

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

пример: `

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

Хотя это, вероятно, работает, это не очень изящное решение. Работа по преобразованию объектов Java в JSON может быть выполнена Джерси (в этом весь смысл использования такой структуры), поэтому не делайте этого самостоятельно. – sleske

+0

Просто используя «новый Gson(). ToJson» работает ... – Ran

0

Я сталкивался с подобной проблемой, так как конструктор этот объект использует параметры

Перед

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

После

public MakeMoneyAndGetFitWhileYouSleep(){} 

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

Ниже должно быть указано ваше 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> 
+0

спасибо, это сработало для меня. после этого перейдите к настройкам проекта и выберите все файлы jar и выберите добавить в папку web-inf/lib и перестроить. (используя intellij) :) –

+0

Выдающийся, спасибо! – RedTailedHawk

0

Чтобы решить эту проблему, попробуйте следующее. Работал для меня.

Добавить следующую зависимость в pom.xml

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

И убедитесь, что Модели класс содержит не аргумент конструктора

public Student() 
    { 
    } 
Смежные вопросы