2016-10-05 9 views
0

Jersey 1.x의 Jetty 8 서버에 대해 web.xml에 Jersey SpringServlet을 구성하려고 시도하고이를 <servlet>으로 구성하면 예외가 발생합니다 던지기 :저지 SpringServlet을 서블릿으로 구성하면 "IllegalStateException : No such 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 내가 혜성 푸시 서비스를 수행하기 위해 사용하는 또 다른 서블릿을 추가하고 있기 때문에 나는 SpringServlet는 서블릿 아닌 필터로 작동하도록 할 필요가

<!?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을 필터로 유지하면 요청이 새 서블릿에 도착하지 않습니다.

답변

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 -> 내가 그 호출 경로를했다 부두 (8)의 어떤 버전을 찾을 수 updateMappings

.

어떤 버전의 Jetty 8을 사용하고 있습니까? 우리는 가정을하면

에도 ... com.sun.jersey.spi.spring.container.servlet.SpringServlet 다음 모든 인터페이스를 구현한다는 사실을 차지

  • javax.servlet.Filter
  • javax.servlet.Servlet
  • javax.servlet.ServletConfig 그 부두 결정한다 형식이 잘못 되었더라도 여전히 호출 스택이 발생하지는 않습니다.

    3 개의 인터페이스를 모두 구현 한 클래스로 빠른 테스트 케이스를 작성하고 Jetty 8.1.16.v20140903 배포본에 사용하고 스택 트레이스를 트리거하지 않습니다.

    아마 IllegalStateException이 발생하기 전에 어떤 일이 발생했는지 확인하려면 전체 디버그 로깅을 활성화해야합니다. (그럴 가능성이 매우 높은 SpringServlet init)

    더 큰 (더 정확한) 스택 추적이 있으면 도움이 될 수도 있습니다.

+0

소스를 파헤쳐 줘서 고마워. (Un) 다행스럽게도 지금부터는 덤프를 재현 할 수 없으며 Jetty 8 이상으로 업그레이드 할 수도 없습니다. 제 부티 - 서블릿과 스프링 버전 사이의 pom.xml에 불일치가 있다고 생각합니다. – jiveturkey