MessageBodyWriter找不到vogella教程

时间:2014-11-02 17:27:51

标签: java json tomcat jax-rs jersey-2.0

我正在尝试使用java,JAX-RS和Jersey重新创建用于创建REST的最优秀的vogella教程。

我正在使用带有Java-EE透视的eclipse Kepler,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;
  }

}

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

我也按照指示创建了客户端。

Test.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文件夹并进行部署 - 所有都无济于事。我不知道我是不是完全没有杂草,或者我是否遗漏了一些简单的东西?

3 个答案:

答案 0 :(得分:5)

  

我的理解是jaxrs-ri 2.13包包含了所有必需的内容,包括让我这样做的依赖项 - 而且我不需要添加任何类型的JSON提供程序。

这实际上是不正确的。正如Jersey User Guide 8.1. JSON

所述
  

Jersey JSON支持是一组扩展模块,其中每个模块都包含需要注册到可配置实例(客户端/服务器)的功能实现。有多个框架为JSON处理和/或JSON到Java绑定提供支持。下面列出的模块通过将各个JSON框架集成到Jersey中来提供对JSON表示的支持。目前,Jersey集成了以下模块以提供JSON支持:

     
      
  • MOXy - 通过MOXy的JSON绑定支持是自Jersey 2.0以来在Jersey应用程序中支持JSON绑定的默认和首选方式。当JSON MOXy模块位于类路径上时,Jersey将自动发现模块并通过MOXy在应用程序中无缝启用JSON绑定支持。 (参见第4.3节“自动发现功能”。)

  •   
  • 其他几个

  •   

所以主要的泽西岛下载没有附带这些额外的模块。我们需要单独获得它们。话虽如此,获得所需jersey-media-moxy的最简单方法是通过Maven。

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

如果您没有使用Maven(通过the tutorial查看,但它没有),您将不得不搜索依赖项。 jersey-media-moxy工件有16个依赖项,但幸运的是,大多数都包含在Jersey发行版中。因此,在筛选出已经包含在泽西发行版中的内容之后,这些是你必须自己找到的剩余罐子(我刚创建了一个用户库来测试)

enter image description here

添加这些依赖项将启动并运行the example。添加这些后,测试并按预期工作。

现在你有Eclipse,我认为它带有Maven(m2e)插件。因此,获取这些依赖项的最简单方法是创建一个新的Maven项目,并添加上面显示的依赖项。在构建项目之后,maven应该将所有额外的依赖项下载到您当地的Maven Repo中。只需从那里抓住他们的主要项目。


其他资源/备注

  • Jersey User Guide
  • 我会下载Jersey Example package,这比你正在使用的教程更新。
  • 如果你不认识Maven,我强烈建议至少学习依赖管理的基础,让构建框架为你抓住所有的依赖。示例包中的所有示例都使用Maven,因此有助于了解基础知识。

答案 1 :(得分:0)

您是否已编写任何自定义MessageBodyWriter,用于从Java到JSON的编组。如果是,那么你需要使用&#39; application / json&#39; @Produces注释。在提供者实现中。有关详细信息,请参阅http://h2labz.blogspot.in/2014/12/marshalling-java-to-json-in-jax-rs.html

答案 2 :(得分:0)

如果您使用 Jersey-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. Jersey的媒体MOXY-2.23.1.jar
  6. 球衣实体过滤-2.23.1.jar
  7. 运行项目它会起作用。还检查你的JAXB分类,因为它将在内部使用xml注释将pojo对象转换为JAXB