gpt4 book ai didi

java - 无法让简单的 RS Web 服务与 Eclipse Mars 一起使用

转载 作者:行者123 更新时间:2023-11-30 02:34:12 24 4
gpt4 key购买 nike

我遵循了一些教程来设置一个非常简单的 Jersey Web 服务,但我对此并不清楚。

有时教程讨论的是更改 web.xml,其他人则说只需要在服务类中包含某些注释。

所以我最终得出以下结论:

使用Jersey 2.x,您无需在 web.xml 中执行任何特定操作,只需将 jersey-container-servlet.jar 放入您的类路径中并创建服务类,如下所示:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@ApplicationPath("rest")
public class RestService extends Application {

@GET
@Path("/sayhello")
@Produces(MediaType.TEXT_PLAIN)
public Response sayHello() {
return Response.ok("Hello World").build();
}

}

这应该允许我使用 http://localhost:8080/EETest/rest/sayhello 访问 API

我仔细检查了项目已部署,没有错误,并且 Tomcat7 服务器正在运行。所有 Jersey jar 和依赖项都在我的 lib 文件夹中,并已添加到项目库中。修改后的index.html在调用http://localhost:8080/EETest

时显示正常

但是 Web 服务没有响应(而是显示 404 页面)。

我知道这一定是一些非常基本的事情,我在这里做错了......我已经没有选择了。

编辑:这是我的 web.xml 的值(value)

<?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>EETest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

最佳答案

不确定您是在哪里学会这样做的

@ApplicationPath("rest")
public class RestService extends Application {

@GET
@Path("/sayhello")
@Produces(MediaType.TEXT_PLAIN)
public Response sayHello() {
return Response.ok("Hello World").build();
}
}

但这是错误的。在 JAX-RS 中,我们有资源类。资源类应使用 @Path 进行注释,而不是 @ApplicationPath。后者用于应用程序配置类。所以你应该有类似的东西

@ApplicationPath("/rest")
public class AppConfig extends Application {}

@Path("/")
public class RestService {
@GET
@Path("/sayhello")
@Produces(MediaType.TEXT_PLAIN)
public Response sayHello() {
return Response.ok("Hello World").build();
}
}

带有@ApplicationPath的空类的作用是触发类路径扫描。因此,将扫描类路径以查找用 @Path@Provider 注解的类,并且这些类将被注册。

在示例中,我使用了 @Path("/"),以便您仍然可以使用相同的 URL /rest/sayHello。但一般来说,资源类会有一个映射到集合 URL 的路径,例如 /rest/animals,因此您可以在类,并且您可以使用该类中也用 @Path 注释的方法添加子资源。任何未使用 @Path 注解的方法,但具有 @GET 之类的方法,都将映射到根资源路径 /rest/animals

还有一些其他的事情。请记住,我提到过用 @ApplicationPath 注释的空 Application 类触发类路径扫描。嗯,这有点令人沮丧。您可以显式注册类

@ApplicationPath("/rest")
public class AppConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<>();
classes.add(RestService.class);
return classes;
}
}

但是当我们使用 Jersey 时,最好使用 Jersey 特定的类(除非您需要在 JAX-RS 实现之间保持可移植性)。对于 Jersey,您可以使用它的 ResourceConfig 类(它是 Application 的子类)。您可以使用 register 方法注册单个类,也可以使用 packages 方法触发包扫描(与类路径扫描不同)

@ApplicationPath("/rest")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("the.packages.to.scan");

register(RestService.class);
}
}

关于java - 无法让简单的 RS Web 服务与 Eclipse Mars 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537141/

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