2010-08-17 2 views
1

Ниже представлен мой дескриптор развертывания. Я использую Spring MVC, но у меня есть фильтр перезаписи url, который должен запускаться, а затем переходить к соответствующему контроллеру. По какой-то причине этот фильтр загружается при запуске, пытается перевести путь и бросает исключение nullpointer, потому что пути нет. Я никогда не знал, что фильтры загружаются при запуске, но похоже, что это происходит.Как получить фильтры сервлета, чтобы остановить загрузку при запуске приложения в Tomcat?

<!-- SERVLETS --> 

<servlet> 
    <servlet-name>springmvc</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>springmvc</servlet-name> 
    <url-pattern>/index.html</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    <servlet-name>springmvc</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<!-- FILTERS --> 

<filter> 
    <filter-name>URLRewriteFilter</filter-name> 
    <filter-class>com.ecomm.filters.URLRewriteFilter</filter-class> 
</filter> 

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

EDIT:

Aug 17, 2010 11:28:12 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet jsp threw exception 
java.lang.NullPointerException 
    at com.ecomm.helpers.TranslateURLHelper.executeController(TranslateURLHelper.java:47) 
    at com.ecomm.filters.URLRewriteFilter.doFilter(URLRewriteFilter.java:41) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Unknown Source) 

ответ

5

Похоже, что вы развертываете webapp в контексте ROOT с помощью Eclipse. Плагин Tomcat Eclipse действительно самотестирует при запуске, запуская запрос GET на ROOT.

Просто проигнорируйте его или исправьте код, чтобы он не бросал NPE. Это ИМО определенно ошибка в com.ecomm.filters.URLRewriteFilter. Пустые пути не должны считаться исключительными случаями. Эндузеры могут стрелять в них так же хорошо.

+0

Я действительно запускаю приложение как ROOT через Eclipse. Если вы не возражаете, чтобы я задал другой вопрос, откуда вы узнали, что Tomcat запускает запрос GET в ROOT при запуске? Благодаря! – 2010-08-17 16:36:08

+0

На самом деле это плагин Eclipse Tomcat, который делает это. Я наблюдал это поведение раньше, и я могу подтвердить поведение, которое вы видите. – BalusC

1

Это не имеет особого смысла. Фильтры применяются только к запросам. Вы уверены, что в конфигурации Spring нет ничего, что привело бы к: 1) вызвавшемуся классу фильтра или 2) отключению HTTP-запроса?

Что показывает стектура NPE в фильтре?

Я думаю, вам нужно выяснить, откуда эти запросы, чтобы понять, как решить проблему.

+0

Я добавил stacktrace. Похоже, что Tomcat вызывает doFilter(), но я не могу найти нигде, который утверждает загрузку фильтра при запуске, за исключением инициализации. Мой код не находится в init(). Я могу, конечно, добавить условие обо всем в doFilter(), но прежде, чем это сделать, я хотел убедиться, что раньше не было параметра конфигурации. – 2010-08-17 15:37:33

1

Я никогда не знал, что фильтры загружаются при запуске ...

Я предполагаю, что это зависит от того, как вы определяете «нагруженный». Будет создан экземпляр и его метод init(FilterConfig), вызываемый до того, как он будет действовать по запросу, поэтому есть несколько возможностей для его кода выполнить «при запуске». В соответствии с запросом, пожалуйста, опубликуйте фактическое исключение ...

Смежные вопросы