gpt4 book ai didi

java - Tomcat 是否支持开箱即用的 JAX-RS(它是否支持 JAX-RS)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:15 25 4
gpt4 key购买 nike

从教科书《RESTful Java with JAX-RS》中我们可以读到:

If our application server is JAX-RS-aware or, in other words, is tightly integrated with JAX-RS declare our ShoppingApplication class as a servlet:

<?xml version="1.0"?>
<web-app>
<servlet>
<servlet-name>Rest</servlet-name>
<servlet-class>
com.restfully.shop.services.ShoppingApplication
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Rest</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

If our application server is not JAX-RS-aware, you will have to specify the JAX-RS provider's servlet that handles JAX-RS invocations. The Application class should be specified as an init-param of the servlet:

现在我的问题是:Tomcat 是一个支持 JAX-RS 的 Servlet 容器吗?您如何区分 JAX-RS 感知的 servlet 容器和不感知 JAX-RS 的 servlet 容器?为什么在第一种情况下可以使用将 javax.ws.rs.core.Application 扩展为 Servlet 的自定义类?

最佳答案

"Is Tomcat a JAX-RS aware Servlet container?"

没有。

"How do you distinguish a servlet container JAX-RS aware from one wich is not JAX-RS aware?"

事实上它只是一个 Servlet 容器,应该告诉您它不是“JAX-RS 感知”。 JAX-RS 是 Java EE 规范的一部分。 Servlet 容器正如其名称所暗示的那样支持; Servlet 的容器。他们可能支持 JSP 等其他小功能,但不会支持整个 EE 规范。这不是他们设计的一部分。如果你想在 Servlet 容器中使用 JAX-RS,你需要添加一个实现,比如 JerseyResteasy

当您说到 Servlet 容器时,您会想到 Jetty、Tomcat、Undertow、Grizzly 等服务器。如果您想要完整的 Java EE 支持,那么您需要获得支持整个规范的实际 Java EE 应用程序服务器,例如 JBoss/Wildfly、Glassfish、TomEE、WebSphere、WebLogic。

"Why in the first case it's possible to use your custom class wich extends javax.ws.rs.core.Application as a Servlet?"

我无法使用 Glassfish 4.0 或 Wildfly 8.1 生成工作示例,这也没有在 JAX-RS specification 中的任何地方指定。 .在 Glassfish 中,我会得到关于 ShoppingApplication 的异常不是 Servlet,在 Wildfly 中我只会得到一个 NotFoundException ,这意味着应用程序永远不会加载。

我能找到的最接近书中所述的是将应用程序类的名称指定为 <servlet-name> ( JAX-RS 规范的一部分,但完全不依赖于部署到 Java EE 服务器)

<servlet>
<servlet-name>com.restfully.shop.services.ShoppingApplication</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>com.restfully.shop.services.ShoppingApplication</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>

这是来自 JAX-RS 规范

If an Application subclass is present that is not being handled by an existing servlet, then the servlet added by the ContainerInitializer MUST be named with the fully qualified name of the Application subclass.

关于java - Tomcat 是否支持开箱即用的 JAX-RS(它是否支持 JAX-RS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30176555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com