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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (63)

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

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

配置A(工作,但有web.xml配置)

web.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>
   ...

java

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

配置B(有异常)

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

报错:

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

问题

  1. 为什么web.xml定义有效,但注释没有工作呢?有什么区别?
  2. 是否有办法使其工作,例如,有一个JAX-RS应用程序没有web.xml?
提问于
用户回答回答于
@ApplicationPath("/*")
public class MyApplication extends Application {
    ...
}
用户回答回答于

dependencies部分:

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

然后,只需向项目中添加一个应用程序配置类即可。如果除了为REST服务设置上下文路径之外,没有任何特殊的配置需要,那么类可以是空的。一旦添加了该类,就不需要在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);
  }
}

这应该是你所需要的。

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

应该产生预期的结果(5)。

扫码关注云+社区

领取腾讯云代金券