【问题标题】:Avoid StackOverflowError when a call to a non existing URL is made调用不存在的 URL 时避免 StackOverflowError
【发布时间】:2016-05-10 18:33:11
【问题描述】:

我有一个在 Tomcat 7.0 服务器上运行的带有 Spring MVC 的 Web 应用程序。

应用程序运行良好,但每当我尝试调用未配置的 URL 时,我都会看到很多错误和 StackOverflowError 异常。我的日志样本:

SEVERE: Servlet.service() for servlet BatchUI threw exception
java.lang.StackOverflowError
    at org.apache.catalina.core.ContainerBase.getManager(ContainerBase.java:466)
    at org.apache.catalina.connector.Request.doGetSession(Request.java:2905)
    at org.apache.catalina.connector.Request.getSession(Request.java:2310)
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:897)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:592)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:592)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:229)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:592)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:229)

我的应用初始化程序如下所示:

private static final String DISPATCHER_SERVLET_NAME = "BatchUI";
private static final String DISPATCHER_SERVLET_MAPPING = "/";

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    //Load application context
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
    rootContext.register(SpringContextConfiguration.class);
    rootContext.setDisplayName("User Interface");

    //Context loader listener 
    servletContext.addListener(new ContextLoaderListener(rootContext));

    //Dispatcher servlet
    ServletRegistration.Dynamic dispatcher = 
            servletContext.addServlet(DISPATCHER_SERVLET_NAME, new DispatcherServlet(rootContext));
    dispatcher.setLoadOnStartup(1); 
    dispatcher.addMapping(DISPATCHER_SERVLET_MAPPING);
}

大约 10-15 秒后,内部服务器错误返回到浏览器,但我的日志中充满了与我发布的一样的痕迹。

那么,有没有办法避免这些错误?或者可能有更好的方法来处理它们?

我正在考虑添加过滤器并检查请求以验证 URL 是否存在,如果不存在,则重定向到错误页面或其他内容。

非常感谢您的任何建议。

【问题讨论】:

    标签: java spring spring-mvc tomcat7


    【解决方案1】:

    修改了您的 web.xml 文件。使用以下代码。

    <error-page>
    <error-code>404</error-code>
    <location>/error404.jsp</location>
    </error-page>
    

    【讨论】:

    • 谢谢,解决了重定向到另一个页面的问题,我仍然想知道是否可以避免出现大量 StackOverflowError 异常。
    • 看看这个项目bitbucket.org/hebertsouza87/exemplorest/src我认为你没有以最好的方式使用spring mvc。这个项目是restful api的基础,但它确实使用了spring mvc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2011-01-22
    • 2011-08-26
    • 1970-01-01
    • 2011-09-25
    • 2012-03-16
    相关资源
    最近更新 更多