Java 找不到MessageBodyWriter vogella教程
我正试图为CreateRESTwithJava、JAX-RS和Jersey重新创建最优秀的vogella教程 我正在使用EclipseKepler和JavaEE透视图,Tomcat7.0 我已经创建了Todo类,TodoResource类和适当的注释,并部署在Tomcat7上。我已按照说明将jaxrs ri lib导入WEB-INF/lib文件夹 待办事项类: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
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节“自动发现功能”。)
- 还有一些
<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,因此了解基础知识会有所帮助
<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.
所需库列表
运行项目,它将工作。还要检查您的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>