是否可以仅使用注释来设置JAX-RS应用程序?(使用Servlet 3.0和JAX-RS Jersey 1.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 {
...
}
后者似乎坚持认为应用程序将是Servlet的子类(例外不会留下任何猜测)
java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet
问题
发布于 2012-02-22 02:21:19
看起来我需要做的就是这样(Servlet3.0及更高版本)
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/*")
public class MyApplication extends Application {
...
}
而且显然不需要任何web.xml配置(在Tomcat7上试用)
发布于 2014-11-04 03:38:14
如果您使用TOMCAT或JETTY,请阅读**!**
公认的答案是确实可以使用,但前提是必须将webapp部署到Glassfish或Wildfly等应用服务器,以及TomEE等可能带有EE扩展的servlet容器上。It 不能在像Tomcat这样的标准servlet容器上工作,我相信大多数在这里寻找解决方案的人都想使用它。
如果您使用的是标准Tomcat安装(或其他servlet容器),则需要包含REST实现,因为Tomcat没有提供REST实现。如果您使用的是Maven,请将以下内容添加到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);
}
}
这应该就是您需要的全部内容。如果您的Tomcat安装是在本地端口8080上运行的,并且您将WAR文件部署到上下文myContext
,请转到...
http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3
...should产生预期的结果(5)。
发布于 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服务资源。
@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的实现)。
https://stackoverflow.com/questions/9373081
复制相似问题