带有 JAX-RS 2 和 Tomcat 9 的 RESTful Java

job*_*ang 4 java rest jax-rs http-status-code-404

我正在使用 JAX-RS 2 测试 RESTful 服务。下面是我的项目和我的类。

在此处输入图片说明

@ApplicationPath("/test/*")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> clazz = new HashSet<>();
        clazz.add(UserResource.class);
        System.out.println("getClass");
        return clazz;
    }
Run Code Online (Sandbox Code Playgroud)

资源类如:

@ApplicationPath("/test/*")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> clazz = new HashSet<>();
        clazz.add(UserResource.class);
        System.out.println("getClass");
        return clazz;
    }
Run Code Online (Sandbox Code Playgroud)

当我使用 测试服务时http://localhost:8082/dt/test/user,出现 404 错误。

Pau*_*tha 14

您所拥有的只是 JAX-RS API jar。这只是一个“规格”罐子。它只有规范中定义的接口和类。但是这背后没有引擎。该规范仅包含我们可以对其进行编程的API,但这取决于提供引擎的规范的实现;几个实现是 Jersey 和 RESTEasy。

话虽如此,JAX-RS 是 Java EE 规范的一部分,因此任何完全符合 Java EE 的服务器都会将此实现作为其内部库的一部分。但是 Tomcat不是完全兼容的 Java EE 服务器。它只是一个 servlet 容器,只实现了 EE 规范的一小部分,如 servlet 和 JSP。所以如果你想在 Tomcat 中使用 JAX-RS,你应该添加一个implementation

您可以使用的一种实现是Jersey。如果单击该链接,则可以下载“Jersey xx Bundle”。将这些添加到您的项目中,它应该可以工作。

如果您正在使用 Maven,那么您应该运行 Jersey 的最低依赖项如下

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey.version}</version>
    <!-- latest version as of today is 2.32 -->
</dependency>
Run Code Online (Sandbox Code Playgroud)

更新

注意:截至今天(2021 年 5 月 22 日)的最新版本为 3.0.2。随着版本3.x中,对JAX-RS(和其他EE的API)的命名空间已经从javaxjakarta。所以 Tomcat 9 将不支持这一点。您将不得不使用 Tomcat 10,或者您将不得不使用 Jersey 2.x 版。