- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试重新创建最优秀的 vogella 教程,以使用 java、JAX-RS 和 Jersey 创建 REST。
我正在使用具有 Java-EE 视角的 eclipse Kepler,tomcat 7.0。
我已经创建了 Todo 类、带有适当注释的 TodoResource 类并部署在 tomcat 7 上。我已经按照说明将 jaxrs-ri 库导入到 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>
我也按照指示创建了客户端。
测试.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 文件夹并进行部署——但都无济于事。我不知道我是否完全脱离了杂草,或者我是否遗漏了一些简单的东西?
最佳答案
My understanding is that the jaxrs-ri 2.13 bundle includes everything required including dependencies to let me do this - and that I don't need to add any kind of JSON provider.
这实际上是不正确的。如 Jersey User Guide 8.1. JSON 所述
Jersey JSON support comes as a set of extension modules where each of these modules contains an implementation of a Feature that needs to be registered into your Configurable instance (client/server). There are multiple frameworks that provide support for JSON processing and/or JSON-to-Java binding. The modules listed below provide support for JSON representations by integrating the individual JSON frameworks into Jersey. At present, Jersey integrates with the following modules to provide JSON support:
MOXy - JSON binding support via MOXy is a default and preferred way of supporting JSON binding in your Jersey applications since Jersey 2.0. When JSON MOXy module is on the class-path, Jersey will automatically discover the module and seamlessly enable JSON binding support via MOXy in your applications. (See Section 4.3, “Auto-Discoverable Features”.)
Among a few others
所以主要的 Jersey 下载没有附带这些额外的模块。我们需要单独获取它们。也就是说,获得所需 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 发行版中。所以在过滤掉 Jersey 发行版中已经包含的内容之后,这些是您必须自己找到的剩余 jar(我刚刚创建了一个用户库来测试)
添加这些依赖项将得到 the example启动并运行。添加这些后经过测试并按预期工作。
现在您有了 Eclipse,我假设它是 Maven (m2e) 插件附带的。因此,获取这些依赖项的最简单方法可能是创建一个新的 Maven 项目,并添加如上所示的依赖项。构建项目后,maven 应该将所有额外的依赖项下载到本地 Maven Repo 中。只需从那里为您的主要项目获取它们。
其他资源/注释
关于java - 找不到 MessageBodyWriter vogella 教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702196/
假设我在 JAX-RS 1 环境(带有 Jackson 提供程序的 RestEasy 2)中有一个数据类,如下所示: class Foo { int id; String name;
我正在尝试在 JBoss 7.2 Rest Easy 中计算出 JAX-RS 示例。我收到如下错误消息。 SEVERE [org.jboss.resteasy.core.SynchronousDisp
我正在尝试从后端(spring)发送一些混合数据到后端(jersey)要发送的数据是混合的:对象、文件。我不断收到此错误: javax.ws.rs.ProcessingException: No av
我想创建rest api。我不想在每个资源类中重复使用绝对路径,所以我想使其分层。所以而不是像这样: @Path("/") @Component @Scope("request") public cl
我想创建一个 Jersey 提供程序 ( MessageBodyWriter ),它更新 dto 对象属性并继续链接到 Jersey-json 默认提供程序并返回 json 对象。 问题是,看起来默认
在 Dropwizard Web 服务中,我想使用以下自定义 MessageBodyWriter 返回数据库中 Test 类的对象。 @Provider @Produces("applicatio
本质上,我有一个将对象写入 JSON 的 MessageBodyWriter,并且我希望能够根据处理请求的资源方法来控制输出的某些方面。但是,@Provider 类的默认生命周期是单例(每个 JVM
我正在使用 Jetty 制作一个小型 RESTful 服务。使用 Maven 作为构建工具。 当我尝试调用试图访问对象的 JSON 表示的 GET 方法时,我收到“MessageBodyWriter”
我正在尝试在我的自定义 MessageBodyWriter 中获取 HttpServletRequest 的实例。我目前正在使用一个用@Context 注释的成员变量。但是,当请求首次使用编写器时 -
我有一个 REST 服务的返回类型,其中包含一个 Long 字段。当该字段为 NULL 时,返回的 XML 会跳过该字段。我希望该字段作为空元素出现在输出中。 例如:如果 POJO 定义如下: cla
我正在尝试重新创建最优秀的 vogella 教程,以使用 java、JAX-RS 和 Jersey 创建 REST。 我正在使用具有 Java-EE 视角的 eclipse Kepler,tomcat
我目前正在学习 REST,并且在调用方法时遇到错误。我确信这一定是一个简单的配置设置,但由于我对学习 REST 完全陌生,所以无法弄清楚。 web.xml Jersey
我正在使用 Jersey 编写 JAX_RS 应用程序。所有以 JSON 形式返回单个对象的端点在 Tomcat 和 WildFly 中都可以正常工作。 一个返回对象集合的端点在 Tomcat 中工作
Jersey 2.21. 我有如下资源文件 …… @POST @Path("/userReg") @Produces("application/json;charset=UTF-8") public
我想根据请求的 HttpHeader 以两种格式生成 REST API 响应: @Context HttpHeaders headers; public Response toResponse(MyV
我刚刚关注了this tutorial to create a REST API using Jersey on Jetty我喜欢这个结果。一切正常。但如果我运行 Gradle shadowJar生成
我正在使用 Jersey (jaxrs-ri-2.7)、Tomcat 7.0.47 和 Java 1.7.0_51。由于防火墙的原因,我无法使用 Maven。我的目标是做一个 JSON RESTful
如果发生错误(https://jersey.java.net/documentation/latest/representations.html#d0e3586),我正在尝试按照 Jersey 文档启
如何在 Jersey 的 MessageBodyWriter 中更改 HTTP 状态?我知道我可以在 writeTo 方法中通过 httpHeaders 和 entityStream 更改 heade
我已经尝试了所有方法...无法弄清楚为什么会出现此异常。有趣的是,在我的 IDE (Intellij) 中一切正常。想不通。。。放弃了。 你们有什么建议吗? dependencies { co
我是一名优秀的程序员,十分优秀!