MessageBodyWriter не найден учебник по vogella

Я пытаюсь воссоздать самый превосходный учебник vogella для создания REST с помощью java, JAX-RS и Jersey.

Я использую eclipse Kepler с перспективой Java-EE, tomcat 7.0.

Я создал класс Todo, класс TodoResource с соответствующими аннотациями и развернул его на tomcat 7. Я импортировал библиотеки jaxrs-ri в папку WEB-INF/lib в соответствии с инструкциями.

Класс Todo:

package com.vogella.jersey.jaxb.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Todo {
  private String summary;
  private String description;
  public String getSummary() {
    return summary;
  }
  public void setSummary(String summary) {
    this.summary = summary;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }


} 

TodoResource с аннотациями:

package com.vogella.jersey.jaxb.model;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/todo")
public class TodoResource {
  // This method is called if XMLis request
  @GET
  @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
  public Todo getXML() {
    Todo todo = new Todo();
    todo.setSummary("This is my first todo");
    todo.setDescription("This is my first todo");
    return todo;
  }

  // This can be used to test the integration with the browser
  @GET
  @Produces({ MediaType.TEXT_XML })
  public Todo getHTML() {
    Todo todo = new Todo();
    todo.setSummary("This is my first Todo");
    todo.setDescription("This is my first Todo");
    return todo;
  }

}

веб.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>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.vogella.jersey.jaxb</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>

Я также создал клиента в соответствии с инструкциями.

Тест.java:

package com.vogella.jersey.first.client;

import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;

import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientResponse;
import org.glassfish.jersey.message.internal.MediaTypes;

public class Test {

  public static void main(String[] args) {



    ClientConfig config = new ClientConfig();

    Client client = ClientBuilder.newClient(config);

    WebTarget target = client.target(getBaseURI());


    System.out.println(target.path("rest").path("todo").request()

            .accept(MediaType.APPLICATION_XML ).get(Response.class)

            .toString());

    System.out.println(target.path("rest").path("todo").request()

            .accept(MediaType.APPLICATION_JSON ).get(Response.class)

            .toString());


  }

  private static URI getBaseURI() {

      return UriBuilder.fromUri("http://localhost:8080/com.vogella.jersey.jaxb").build();

  }
}

Для MediaType.APPLICATION_XML все работает отлично - сервер возвращает:

InboundJaxrsResponse{ClientResponse{method=GET, uri=http://localhost:8080/com.vogella.jersey.jaxb/rest/todo, status=200, reason=OK}}

Однако для MediaType APPLICATION_JSON, который мне действительно нужен, я получаю сообщение об ошибке:

InboundJaxrsResponse{ClientResponse{method=GET, uri=http://localhost:8080/com.vogella.jersey.jaxb/rest/todo, status=500, reason=Internal Server Error}}

Tomcat четко показывает мне проблему - мне кажется, он не умеет возвращать ответ JSON -

Nov 02, 2014 11:59:19 AM org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=application/json, type=class com.vogella.jersey.jaxb.model.Todo, genericType=class com.vogella.jersey.jaxb.model.Todo.

Насколько я понимаю, пакет jaxrs-ri 2.13 включает в себя все необходимое, включая зависимости, позволяющие мне это сделать, и что мне не нужно добавлять какой-либо поставщик JSON. Я все равно сделал это, например, я попытался добавить gson, я загрузил moxy jar и попытался добавить их в свою папку WEB-INF/lib и развернуть - все безрезультатно. Я не знаю, то ли я совсем запутался, то ли упускаю что-то простое?


person Joe Murray    schedule 02.11.2014    source источник


Ответы (3)


Насколько я понимаю, пакет jaxrs-ri 2.13 включает в себя все необходимое, включая зависимости, позволяющие мне это сделать, и что мне не нужно добавлять какой-либо поставщик JSON.

Это на самом деле неправильно. Как указано в Руководстве пользователя Джерси 8.1. JSON

Поддержка Jersey JSON предоставляется в виде набора модулей расширения, каждый из которых содержит реализацию функции, которую необходимо зарегистрировать в вашем экземпляре Configurable (клиент/сервер). Существует несколько платформ, обеспечивающих поддержку обработки JSON и/или привязки JSON к Java. Перечисленные ниже модули обеспечивают поддержку представлений JSON путем интеграции отдельных фреймворков JSON в Jersey. В настоящее время Jersey интегрируется со следующими модулями для обеспечения поддержки JSON:

  • MOXy. Поддержка привязки JSON через MOXy является стандартным и предпочтительным способом поддержки привязки JSON в ваших приложениях на Джерси, начиная с Jersey 2.0. Когда модуль JSON MOXy находится на пути к классам, Jersey автоматически обнаружит модуль и легко включит поддержку привязки JSON через MOXy в ваших приложениях. (См. Раздел 4.3, «Автообнаруживаемые функции».)

  • Среди нескольких других

Таким образом, основная загрузка Джерси не включает эти дополнительные модули. Нам нужно получить их отдельно. При этом самый простой способ получить необходимый jersey-media-moxy< /a> через Maven.

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

Если вы не используете Maven (который просматривает руководство), он не t), вам придется немного поискать зависимости. Артефакт jersey-media-moxy имеет 16 зависимостей, но, к счастью, большинство из них содержится в дистрибутиве Jersey. Итак, после фильтрации того, что уже было включено в дистрибутив Джерси, это оставшиеся банки, которые вам придется найти самостоятельно (я только что создал пользовательскую библиотеку для проверки).

введите здесь описание изображения

Добавление этих зависимостей заставит пример работать. Протестировано и работает, как ожидалось, после их добавления.

Теперь у вас есть Eclipse, который, как я полагаю, поставляется с плагином Maven (m2e). Поэтому, возможно, самый простой способ получить эти зависимости — создать новый проект Maven и добавить зависимость, показанную выше. После сборки проекта maven должен загрузить все дополнительные зависимости в локальный репозиторий Maven. Просто возьмите их оттуда для вашего основного проекта.


Другие ресурсы/примечания

  • Руководство пользователя Джерси
  • Я бы загрузил пакет Jersey Example package, который более актуален, чем используемое вами руководство.
  • Если вы не знаете Maven, я настоятельно рекомендую изучить хотя бы основы управления зависимостями и позволить фреймворку сборки собрать все зависимости за вас. Кроме того, все примеры в пакете примеров используют Maven, поэтому полезно знать основы.
person Paul Samsotha    schedule 03.11.2014
comment
Большое спасибо - ваш ответ был ударом по деньгам. Я собираюсь потратить некоторое время на изучение Maven, как вы предлагаете - это довольно просто, так как я все равно использую eclipse, и это, безусловно, кажется гладким. еще раз спасибо. - person Joe Murray; 04.11.2014

Написали ли вы какой-либо пользовательский MessageBodyWriter для сортировки с Java на JSON. Если да, то вам нужно иметь аннотацию @Produces с «application/json» в реализации поставщика. Для получения дополнительной информации см. http://h2labz.blogspot.in/2014/12/marshalling-java-to-json-in-jax-rs.html

person Thamizharasu    schedule 22.12.2014

Если вы используете Джерси-2

Конфигурация Web.xml

    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servletclass>

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.oracle.restful</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>

Список необходимых библиотек

  1. org.eclipse.persistence.moxy-2.6.3.jar
  2. org.eclipse.persistence.core-2.6.3.jar
  3. org.eclipse.persistence.asm-2.6.3.jar
  4. org.eclipse.persistence.antlr-2.6.3.jar
  5. Джерси-медиа-мокси-2.23.1.jar
  6. Джерси-объект-фильтрация-2.23.1.jar

Запустите проект, он будет работать. Также проверьте свой класс JAXB, потому что он будет внутренне использовать аннотацию xml для преобразования объекта pojo в JAXB.

person Harsh Maheswari    schedule 07.07.2016