首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何只使用注释(不使用web.xml)设置JAX-RS应用程序?

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

Stack Overflow用户
提问于 2012-02-21 14:19:45
回答 6查看 118.3K关注 0票数 81

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

我试过了,但一无所获。使用一些web.xml似乎是必需的。

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

web.xml

代码语言:javascript
复制
   ...
   <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

代码语言:javascript
复制
@ApplicationPath("/")
public class MyApplication extends Application {
    ...
}

配置B(不工作,抛出异常)

代码语言:javascript
复制
@ApplicationPath("/")
@WebServlet("/*") // <-- 
public class MyApplication extends Application {
    ...
}

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

代码语言:javascript
复制
java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet

问题

  1. 为什么web.xml定义有效,而注释无效?有什么difference?
  2. Is可以让它工作吗?例如,有一个没有web.xml的JAX-RS应用程序?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-02-22 02:21:19

看起来我需要做的就是这样(Servlet3.0及更高版本)

代码语言:javascript
复制
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

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

而且显然不需要任何web.xml配置(在Tomcat7上试用)

票数 51
EN

Stack Overflow用户

发布于 2014-11-04 03:38:14

如果您使用TOMCAT或JETTY,请阅读**!**

公认的答案是确实可以使用,但前提是必须将webapp部署到Glassfish或Wildfly等应用服务器,以及TomEE等可能带有EE扩展的servlet容器上。It 不能在像Tomcat这样的标准servlet容器上工作,我相信大多数在这里寻找解决方案的人都想使用它。

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

代码语言:javascript
复制
<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.bundles</groupId>
    <artifactId>jaxrs-ri</artifactId>
    <version>2.13</version>
  </dependency>
  ...
</dependencies>

然后只需将应用程序配置类添加到您的项目中。如果除了为rest服务设置上下文路径之外,您没有任何特殊的配置需求,那么这个类可以是空的。一旦添加了这个类,您就不需要在web.xml中配置任何东西(或者根本不需要一个):

代码语言:javascript
复制
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服务非常简单:

代码语言:javascript
复制
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,请转到...

代码语言:javascript
复制
http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3

...should产生预期的结果(5)。

票数 171
EN

Stack Overflow用户

发布于 2013-04-02 05:18:38

JAX-RS: Java™ API for RESTful Web Services规范的第2章描述了Servlet环境中JAX-RS应用程序的发布过程(规范中的2.3.2Servlet一节)。

请注意,仅建议使用Servlet 3环境(第6页的2.3.2节Servlet ):

建议实现支持Servlet3框架可插拔机制,以实现容器之间的可移植性,并利用容器提供的类扫描功能。

简而言之,如果您想使用no-web.xml方法,可以使用一个自定义的javax.ws.rs.core.Application实现,该实现使用javax.ws.rs.ApplicationPath注释注册RESTful服务资源。

代码语言:javascript
复制
@ApplicationPath("/rest")

虽然您特别询问了Jersey,但您可能也喜欢阅读文章Implementing RESTful services with JAX-RS and WebSphere 8.5 Liberty Profile,其中我描述了WebSphere Liberty Profile的no-web.xml发布过程(使用Apache Wink作为JAX-RS的实现)。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9373081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档