我按照一些教程设置了一个非常简单的Jersey Webservice,这对我来说还不是很清楚。
有时教程是在讨论更改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
我仔细检查了项目是否已部署且没有错误且Tomcat7服务器正在运行。所有的球衣罐和依赖项都在我的lib文件夹中,并已添加到项目库中。调用http://localhost:8080/EETest
但是网络服务没有响应(显示404页面)。
我知道这一定是非常基本的我在这里做错了......我的选择已经用完了。
编辑:这是我的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>EETest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
答案 0 :(得分:2)
不知道你在哪里学会这样做
@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
。 Latter用于应用程序配置类。所以你应该有像
@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("/")
,因此您仍然可以使用相同的网址/rest/sayHello
。但通常,资源类将有一个映射到集合URL的路径,如/rest/animals
,因此您可以在类上使用@Path("animals")
,并且您也可以使用该类中的方法添加子资源用@Path
注释。任何未使用@Path
注释但具有@GET
方法的方法都将映射到根资源路径/rest/animals
。
其他一些事情。请记住,我提到使用Application
注释的空@ApplicationPath
类触发类路径扫描。嗯,这有点气馁。您可以明确注册类
@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);
}
}