【问题标题】:Cannot get simple RS webservice to work with Eclipse Mars无法让简单的 RS Web 服务与 Eclipse Mars 一起使用
【发布时间】:2017-04-21 08:02:22
【问题描述】:

我遵循了一些教程来设置一个非常简单的 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 服务器正在运行。所有的 jersey jar 和依赖项都在我的 lib 文件夹中,并已添加到项目库中。修改后的 index.html 调用http://localhost:8080/EETest时显示正常

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

【问题讨论】:

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


    【解决方案1】:

    不知道你是从哪里学来的

    @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("animals"),并且您可以使用该类中的方法添加子资源,也使用 @987654332 注释@。任何没有用@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);
        }
    }
    

    【讨论】:

    • 效果很好。我对这些更改感到非常惊讶,因为我曾经使用 Jersey 设置了一个 Rest Webservice,但我猜它是 1.x,因为我必须在 web.xml 中设置配置,并且没有“Application”或“ApplicationPath” " 涉及
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2021-03-05
    • 1970-01-01
    • 2013-04-30
    • 2019-03-04
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多