无法使用简单的RS Web服务与Eclipse Mars一起工作

时间:2017-04-21 08:02:23

标签: java eclipse jax-rs tomcat7 jersey-2.0

我按照一些教程设置了一个非常简单的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

访问API

我仔细检查了项目是否已部署且没有错误且Tomcat7服务器正在运行。所有的球衣罐和依赖项都在我的lib文件夹中,并已添加到项目库中。调用http://localhost:8080/EETest

时,修改后的index.html显示正常

但是网络服务没有响应(显示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>

1 个答案:

答案 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);
    }
}