如何仅使用注释(无 web.xml)设置 JAX-RS 应用程序?

2022-08-31 12:11:21

是否可以仅使用注释来设置 JAX-RS 应用程序?(使用 Servlet 3.0 和 JAX-RS Jersey 1.1.0)

我试过了,但没有运气。使用一些似乎是必需的。web.xml


配置 A(工作正常,但具有 Web .xml 配置)

网.xml

   ...
   <servlet>
      <servlet-name>org.foo.rest.MyApplication</servlet-name>
   </servlet>
   <servlet-mapping>
       <servlet-name>org.foo.rest.MyApplication</servlet-name>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
   ...

爪哇岛

@ApplicationPath("/")
public class MyApplication extends Application {
    ...
}

配置 B(不起作用,引发异常)

@ApplicationPath("/")
@WebServlet("/*") // <-- 
public class MyApplication extends Application {
    ...
}

后者似乎坚持认为应用程序将是Servlet的子类(例外不容猜测)

java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet

问题

  1. 为什么网络.xml定义有效,但注释不起作用?有什么区别?

  2. 有没有办法让它工作,例如,有一个没有web.xml的JAX-RS应用程序?


答案 1

**请阅读您是否使用TOMCAT或JETTY!**

接受的答案确实有效,但前提是将web应用程序部署到Glassfish或Wildfly等应用程序服务器,并且可能具有EE扩展(如TomEE)的servlet容器。它不适用于像Tomcat这样的标准servlet容器,我相信大多数在这里寻找解决方案的人都想使用它。

如果您使用的是标准的Tomcat安装(或其他一些servlet容器),则需要包含REST实现,因为Tomcat没有附带一个。如果您使用的是 Maven,请将以下内容添加到以下部分:dependencies

<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.bundles</groupId>
    <artifactId>jaxrs-ri</artifactId>
    <version>2.13</version>
  </dependency>
  ...
</dependencies>

然后,只需将应用程序配置类添加到项目中即可。如果除了为其余服务设置上下文路径之外,没有任何特殊的配置需求,则该类可以为空。添加此类后,您无需在 中配置任何内容(或根本没有配置):web.xml

package com.domain.mypackage;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest") // set the path to REST web services
public class ApplicationConfig extends Application {}

在此之后,使用 Java 类中的标准 JAX-RS 注释直接声明 Web 服务:

package com.domain.mypackage;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;

// It's good practice to include a version number in the path so you can have
// multiple versions deployed at once. That way consumers don't need to upgrade
// right away if things are working for them.
@Path("calc/1.0")
public class CalculatorV1_0 {
  @GET
  @Consumes("text/plain")
  @Produces("text/plain")
  @Path("addTwoNumbers")
  public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
    return String.valueOf(n1 + n2);
  }
}

这应该是您所需要的。如果您的 Tomcat 安装正在端口 8080 本地运行,并且您将 WAR 文件部署到上下文,请转到...myContext

http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3

...应产生预期结果 (5)。


答案 2

看来我需要做的就是这个(Servlet 3.0及更高版本)

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

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

显然不需要web.xml配置(在Tomcat 7上尝试过)


推荐