Jboss: RestEasy + spring 调度程序 servlet = 没有为 servlet javax.ws.rs.core.Application 指定 servlet class

Jboss: RestEasy + spring dispatcher servlet = no servlet class has been specified for servlet javax.ws.rs.core.Application

我有一个部署到 Jboss eap 6.4 的应用程序。 在 web.xml 中,我将 javax.ws.rs.core.Application 定义为 servlet 并注册了所有以 'api' (/api/*).

开头的网址
<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>1</url-pattern>
</servlet-mapping>

前段时间我添加了一个 spring DispatcherServlet 作为第二个 servlet,为所有以 'admin' (/admin/*)

开头的 url 注册
  <servlet>
        <servlet-name>admin dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>...</init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>admin dispatcher</servlet-name>
        <url-pattern>/admin/*</url-pattern>
    </servlet-mapping>

你猜怎么着?当我启动一个应用程序时,我在主题中遇到了错误。

no servlet class has been specified for servlet javax.ws.rs.core.Application

通过调试 RestEasy 源代码,如果 RestEasy 发现 "org.springframework.web.servlet.DispatcherServlet"(硬编码字符串)在 web.xml 中的某个地方被使用,它似乎在 Jboss/RestEasy 集成的某个很深的地方,它只是停止自动配置和后来由于配置错误而失败。

有一个棘手的解决方法 - 只需扩展 spring 的调度程序 servlet MyDispatcherServlet extends DispatcherServlet 并在 web.xml 而不是 spring 中使用它。这是为了欺骗硬编码字符串。

瞧 - RestEasy 和 spring 调度员开始一起工作。