Undertow:使用现有的 Servlet 实例

Posted

技术标签:

【中文标题】Undertow:使用现有的 Servlet 实例【英文标题】:Undertow: Using existing Servlet instance 【发布时间】:2021-09-12 11:14:20 【问题描述】:

我正在尝试用 Undertow 替换现有应用程序中的嵌入式 Web 服务器,因为旧的在某些情况下无法正常工作。

嵌入式 Web 服务器用于为一些简单的 servlet 提供服务。我的主要问题是我找不到在 Undertow 中注册现有 HttpServlet 实例的方法。

我能找到的所有 API 方法都只接受 Class<? extends Servlet>。另外servlet tutorials 和其他人只使用Class<? extends Servlet> 来注册一个servlet。

但是我的 Servlet 已经存在,我需要直接使用它们,因为每个 Servlet 都已经配置了某些参数,因此不能仅通过提供类名来创建。

有什么方法可以使用直接在 Undertow 中实现 javax.servlet.Servlet 的类的现有实例,或者 Undertow 不能用于这种情况?

【问题讨论】:

@BalusC 你有什么参考资料吗?对于传统的 Web 服务器,这可能是有意义的,因为您必须在配置文件中引用 Servlet 类,但是设计为嵌入到应用程序中的服务器对我来说没有任何意义。 @BalusC 我什至在 Servlet 2.1 规范中找到了这个定义(在 Wayback Machine 中可用) 【参考方案1】:

可以通过 Servlet.servlet(String, Class<? extends Servlet>, InstanceFactory<? extends Servlet> servlet) 方法在 Undertow 中使用现有的 Servlet 实例:

Servlet myServletInstance = ...
Servlets.servlet("MessageServlet", MessageServlet.class, 
    new ImmediateInstanceFactory<Servlet>(myServletInstance))
            .addMapping("/*")

在这种情况下,class 参数被忽略,而不是 Undertow 在内部通过构造函数创建新实例,而是使用提供的 servlet 实例。

【讨论】:

以上是关于Undertow:使用现有的 Servlet 实例的主要内容,如果未能解决你的问题,请参考以下文章

使用 Guice 和 Undertow 在 Camel 中使用 rest Servlet

Spring 5的Servlet和反应式技术栈解析

大神教你玩Spring 5的Servlet与响应式技术栈解析

如何将 bean 注入 Undertow 中的 servlet 过滤器?

Wildfly Undertow:jakarta.servlets.Servlet 没有实现 javax.servlet.Servlet

请求 io.undertow.servlet.spec.HttpServletRequestImpl 不是原始的或包装器