Java 找不到MessageBodyWriter vogella教程

Java 找不到MessageBodyWriter vogella教程,java,json,tomcat,jax-rs,jersey-2.0,Java,Json,Tomcat,Jax Rs,Jersey 2.0,我正试图为CreateRESTwithJava、JAX-RS和Jersey重新创建最优秀的vogella教程 我正在使用EclipseKepler和JavaEE透视图,Tomcat7.0 我已经创建了Todo类,TodoResource类和适当的注释,并部署在Tomcat7上。我已按照说明将jaxrs ri lib导入WEB-INF/lib文件夹 待办事项类: package com.vogella.jersey.jaxb.model; import javax.xml.bind.annota

我正试图为CreateRESTwithJava、JAX-RS和Jersey重新创建最优秀的vogella教程

我正在使用EclipseKepler和JavaEE透视图,Tomcat7.0

我已经创建了Todo类,TodoResource类和适当的注释,并部署在Tomcat7上。我已按照说明将jaxrs ri lib导入WEB-INF/lib文件夹

待办事项类:

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>
对于MediaType.APPLICATION\u XML,一切都非常有效-服务器返回:

InboundJaxrsResponse{ClientResponse{method=GET, uri=http://localhost:8080/com.vogella.jersey.jaxb/rest/todo, status=200, reason=OK}}
但是,对于我实际需要的MediaType应用程序_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.
我的理解是,JAXRSRI2.13捆绑包包含了实现这一点所需的一切,包括依赖项,我不需要添加任何类型的JSON提供程序。无论如何,我已经这样做了,我已经尝试添加gson,例如,我下载了moxy JAR,并尝试将它们添加到我的WEB-INF/lib文件夹并部署-所有这些都没有用。我不知道我是完全陷入了困境,还是错过了一些简单的事情

我的理解是,JAXRSRI2.13捆绑包包含了实现这一点所需的一切,包括依赖项,我不需要添加任何类型的JSON提供程序

这实际上是不正确的。如会议所述

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

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

  • 还有一些

所以主要的Jersey下载没有附带这些额外的模块。我们需要分别获得它们。这就是说,获得所需信息的最简单方法是通过Maven

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

org.glassfish.jersey.media
,它不会),您必须对依赖项进行一些搜索。jersey media moxy
工件有16个依赖项,但幸运的是,大多数依赖项都包含在jersey发行版中。因此,在过滤掉Jersey发行版中已经包含的内容后,这些是您必须自己查找的剩余JAR(我刚刚创建了一个用户库以进行测试)

添加这些依赖项将启动并运行。添加这些后,测试和工作正常

现在有了Eclipse,我想它是随Maven(m2e)插件而来的。因此,获取这些依赖关系的最简单方法可能是创建一个新的Maven项目,并添加上面显示的依赖关系。构建项目后,maven应该将所有额外的依赖项下载到本地maven Repo中。只要从那里抓到它们,作为你的主要项目


其他资源/注释

  • 我会下载,它比你正在使用的教程更新
  • 如果您不了解Maven,我强烈建议您至少学习依赖关系管理的基础知识,让构建框架为您获取所有依赖关系。此外,示例包中的所有示例都使用Maven,因此了解基础知识会有所帮助

您是否为从Java到JSON的编组编写了自定义MessageBodyWriter。如果是,那么您需要在提供者实现中使用带有“application/json”的@products注释。有关更多详细信息,请参阅您正在使用的球衣-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>
球衣休息服务 org.glassfish.jersey.servlet.ServletContainer jersey.config.server.provider.packages com.oracle.restful 1. 所需库列表

  • org.eclipse.persistence.moxy-2.6.3.jar
  • org.eclipse.persistence.core-2.6.3.jar
  • org.eclipse.persistence.asm-2.6.3.jar
  • org.eclipse.persistence.antlr-2.6.3.jar
  • jersey-media-moxy-2.23.1.jar
  • jersey-entity-filtering-2.23.1.jar

  • 运行项目,它将工作。还要检查您的JAXB classed,因为它将在内部使用xml注释将pojo对象转换为JAXB

    ,非常感谢-您的答案非常划算。正如您所建议的,我将花一些时间学习Maven——这非常简单,因为我使用的是eclipse,而且它看起来确实很流畅。再次感谢。
        <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>