【问题标题】:Configuring jersey SpringServlet as a servlet throws "IllegalStateException: No Such servlet"将球衣 SpringServlet 配置为 servlet 会引发“IllegalStateException:没有这样的 servlet”
【发布时间】:2017-02-14 01:32:56
【问题描述】:

我正在尝试在 Jersey 1.x 上为我的 Jetty 8 服务器配置 web.xml 中的 Jersey SpringServlet,当我将其配置为 <servlet> 时,我得到了抛出异常:

java.lang.IllegalStateException: No Such servlet: null
    at org.eclipse.jetty.servlet.ServletHandler.updateMappings(ServletHandler.java:1320)
    at org.eclipse.jetty.servlet.ServletHandler.setFilterMappings(ServletHandler.java:1414)
    at org.eclipse.jetty.servlet.ServletHandler.addServletMapping(ServletHandler.java:896)

抱歉,堆栈跟踪太短了,我无法复制/粘贴。

这是我的web.xml

<!?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd"
    version="3.0">
    <display-name>tpm</display-name>

    <context-param>
       <param-name>spring.profiles.default</param-name>
       <param-value>prod</param-value>
    </context-param>

    <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:spring/tpm-ui-context.xml</param-value>
    </context-param>

    <context-param>
       <param-name>resteasy.scan</param-name>
       <param-value>false</param-value>
    </context-param>

    <context-param>
       <param-name>resteasy.scan.providers</param-name>
       <param-value>false</param-value>
    </context-param>

    <context-param>
       <param-name>resteasy.scan.resources</param-name>
       <param-value>false</param-value>
    </context-param>

    <listener>
       <listener-class>org.springframework.web.context.ContextLoadListener</listener-class>
    </listener>

    <listener>
       <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

    <filter>
       <filter-name>securityCheckFilter</filter-name>
       <filter-class>tpm.ui.filter.SecurityCheckFilter</filter-class>
       <async-supported>true</async-supported>
    </filter>

    <filter>
       <filter-name>cacheControlFilter</filter-name>
       <filter-class>tpm.core.rest.filter.ControlFilter</filter-class>
       <async-supported>true</async-supported>
    </filter>

    <!-- HERE'S THE PROBLEM, WHEN DECLARED AS A FILTER THE APPLICATION WORKS! -->
    <servlet>
       <servlet-name>jersey</servlet-name>
       <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
       <init-param>
          <param-name>com.sun.jersey.config.property.packages</param-name>
          <param-value>tpm.ui.resources</param-value>
       </init-param>

       <!-- WHEN DEFINED AS A FILTER THIS <init-param> IS UNCOMMENTED

       <init-param>
          <param-name>com.sun.jersey.config.property.WebPageContexRegex</param-name>
          <param-value>/|/.*(jsp|txt|html|woff|ttf)|/(images|js|swf|css|font|styles|api|(WEB-INF/jsp)|favicon.ico)/.*</param-value>
       -->

       <load-on-startup>1</load-on-startup>
       <async-supported>true</async-supported>
    </servlet>

   <filter-mapping>
      <filter-name>securityCheckFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

   <filter-mapping>
      <filter-name>cacheControlFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

   <servlet-mapping>
      <servlet-name>jersey</servlet-name>
      <url-pattern>/*</url-pattern>
   </servlet-mapping>

我需要让 SpringServlet 作为 Servlet 而不是 Filter 工作,因为我正在添加另一个使用 Comet 执行推送服务的 Servlet。如果我将 SpringServlet 作为过滤器,则请求将永远不会到达我的新 Servlet。

【问题讨论】:

    标签: spring servlets jetty servlet-filters servlet-3.0


    【解决方案1】:

    注意:Jetty 8 is EOL(生命周期结束),考虑升级。

    那个堆栈跟踪没有意义。

    java.lang.IllegalStateException: No Such servlet: null
        at org.eclipse.jetty.servlet.ServletHandler.updateMappings(ServletHandler.java:1320)
        at org.eclipse.jetty.servlet.ServletHandler.setFilterMappings(ServletHandler.java:1414)
        at org.eclipse.jetty.servlet.ServletHandler.addServletMapping(ServletHandler.java:896)
    

    它来自addServletMapping -> setFilterMappings -> updateMappings

    我找不到具有该调用路径的 Jetty 8 版本。

    您使用的是哪个版本的 Jetty 8?

    即使考虑到com.sun.jersey.spi.spring.container.servlet.SpringServlet 实现了以下所有接口这一事实......

    • javax.servlet.Filter
    • javax.servlet.Servlet
    • javax.servlet.ServletConfig

    如果我们假设 jetty 判断类型不好,那么调用堆栈仍然不可能发生。

    继续并用一个实现所有这 3 个接口的类模拟了一个快速测试用例,并将其用于 Jetty 8.1.16.v20140903 分发,它不会触发该堆栈跟踪。

    也许您需要启用完整的调试日志记录以查看在IllegalStateException 发生之前发生了什么。 (很可能不是导致它的SpringServlet init)

    如果您有更大(更准确)的堆栈跟踪,那也可能会有所帮助。

    【讨论】:

    • 感谢您挖掘源代码。 (Un)幸运的是,自从我过去了之后,我无法重现转储,我也无法升级到 Jetty 8 以上。我认为这一切都归结为我的 pom.xml 在我的 jetty-servlet 和 spring 版本之间的不匹配。
    猜你喜欢
    • 2014-12-06
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多