如何仅使用注释(无 web.xml)设置 JAX-RS 应用程序?
是否可以仅使用注释来设置 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
问题
为什么 web.xml 定义起作用但注释不起作用?有什么区别?
有没有办法让它工作,例如有一个没有 web.xml 的 JAX-RS 应用程序?
Is it possible to set up a JAX-RS application using annotations only? (using Servlet 3.0 and JAX-RS Jersey 1.1.0)
I tried and had no luck. Using some web.xml
seems required.
Configuration A (working, but has web.xml configuration)
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 {
...
}
Configuration B (not working, exception thrown)
@ApplicationPath("/")
@WebServlet("/*") // <--
public class MyApplication extends Application {
...
}
The latter seems to insist that the Application will be a subclass of Servlet (the exception leaves no guesswork)
java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet
Questions
Why the web.xml definition worked but the annotation didn't? What's the difference?
Is there a way to have it worked, e.g. have a JAX-RS Application with no web.xml?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
** 如果您使用 TOMCAT 或 JETTY,请阅读! **
接受的答案确实有效,但前提是 Web 应用程序部署到 Glassfish 或 Wildfly 等应用程序服务器,并且可能部署到具有 EE 扩展(如 TomEE)的 servlet 容器。它不适用于标准 servlet 容器(例如 Tomcat),我确信大多数在这里寻找解决方案的人都想使用 Tomcat。
如果您使用标准 Tomcat 安装(或其他一些 servlet 容器),则需要包含 REST 实现,因为 Tomcat 不附带 REST 实现。如果您使用 Maven,请将其添加到
dependency
部分:然后只需将应用程序配置类添加到您的项目即可。如果除了为其余服务设置上下文路径之外没有任何特殊配置需求,则该类可以为空。添加此类后,您无需在
web.xml
中配置任何内容(或者根本不需要配置):在此之后,可以使用标准 JAX-RS 注释直接声明您的 Web 服务在您的 Java 类中:
这应该就是您所需要的。如果您的 Tomcat 安装在端口 8080 上本地运行,并且您将 WAR 文件部署到上下文
myContext
,则......应该会产生预期结果 (5)。
** PLEASE READ IF YOU USE TOMCAT OR JETTY! **
The accepted answer does work, but only if the webapp is deployed to an app server like Glassfish or Wildfly, and possibly servlet containers with EE extensions like TomEE. It doesn't work on standard servlet containers like Tomcat, which I'm sure most people looking for a solution here want to use.
If you're using a standard Tomcat install (or some other servlet container), you need to include a REST implementation since Tomcat doesn't come with one. If you're using Maven, add this to the
dependencies
section:Then just add an application config class to your project. If you don't have any special configuration needs aside from setting the context path for the rest services, the class can be empty. Once this class is added, you don't need to configure anything in
web.xml
(or have one at all):After this, declaring your web services is straight forward using the standard JAX-RS annotations in your Java classes:
This should be all you need. If your Tomcat install is running locally on port 8080 and you deploy your WAR file to the context
myContext
, going to......should produce the expected result (5).
看来我需要做的就是这个(Servlet 3.0及以上)
并且显然不需要web.xml配置(在Tomcat 7上尝试过)
It seems that all I needed to do is this (Servlet 3.0 and above)
And no web.xml configuration was apparently needed (tried on Tomcat 7)
JAX-RS:用于 RESTful Web 服务的 Java™ API 规范的第 2 章描述了Servlet 环境中的 JAX-RS 应用程序(规范中的2.3.2 Servlet部分)。
请注意,仅建议使用 Servlet 3 环境(第 6 页,第 2.3.2 Servlet 节):
简而言之,如果您想使用 no-web.xml 方法,可以使用 javax.ws.rs.core.Application 向 javax.ws.rs.ApplicationPath 注释。
尽管您具体询问了 Jersey,您可能还想阅读文章使用 JAX-RS 和 WebSphere 8.5 Liberty Profile 实现 RESTful 服务 其中我描述了 WebSphere Liberty Profile(使用 Apache Wink 作为 JAX-RS 的实现)。
Chapter 2 of the JAX-RS: Java™ API for RESTful Web Services specification describes the publication process of a JAX-RS application in Servlet environment (section 2.3.2 Servlet in the specification).
Please note that Servlet 3 environment is recommended only (section 2.3.2 Servlet, page 6):
In short, if you want to use a no-web.xml approach, it's possible with a custom implementation of javax.ws.rs.core.Application that registers RESTful service resources with the javax.ws.rs.ApplicationPath annotation.
Although you asked specifically about Jersey you may also like to read the article Implementing RESTful services with JAX-RS and WebSphere 8.5 Liberty Profile in which I described the no-web.xml publication process for WebSphere Liberty Profile (with Apache Wink as the implementation of JAX-RS).
您需要在 pom.xml 中设置正确的依赖项
更多详细信息:
jax 的入门示例-rs
You need to setup the right dependencies in pom.xml
More details here:
Starter example for jax-rs
前面提到的依赖项对我不起作用。来自泽西岛用户指南:
https://jersey.github.io/documentation/latest/部署.html#deployment.servlet.3
The previously mentioned dependencies did not work for me. From the Jersey User guide:
https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3
正如 @Eran-Medan 指出的,JBoss EAP 7.1(注意没有 Web 应用程序,所以没有 servlet,我是在 EJB 3.2 项目中执行的)我必须添加“value”属性,就像我收到一个异常一样value 属性是必需的。
这对我有用
堆栈跟踪
As @Eran-Medan pointed out, JBoss EAP 7.1 (note without a Web Application so no servlet, I was doing it in a EJB 3.2 project) I had to add the "value" attribute as such as I was getting an exception that the value attribute was required.
This worked for me
Stack Trace