gpt4 book ai didi

java - 找不到 MessageBodyWriter vogella 教程

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:01 24 4
gpt4 key购买 nike

我正在尝试重新创建最优秀的 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(我刚刚创建了一个用户库来测试)

enter image description here

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

现在您有了 Eclipse,我假设它是 Maven (m2e) 插件附带的。因此,获取这些依赖项的最简单方法可能是创建一个新的 Maven 项目,并添加如上所示的依赖项。构建项目后,maven 应该将所有额外的依赖项下载到本地 Maven Repo 中。只需从那里为您的主要项目获取它们。


其他资源/注释

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

关于java - 找不到 MessageBodyWriter vogella 教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com