Spring mvc - 如何将所有错误的请求映射映射到单个方法

时间:2016-11-09 10:15:44

标签: java spring spring-mvc

我正在使用spring(版本3.2.5)注释驱动的mvc应用程序,基本上我需要能够捕获任何错误的url到单个方法然后显示错误消息。例如,如果我的正确url www.url.valid/login映射到控制器,如果用户错误地插入 loginw 或任何无效的网址,则应映射到默认控制器。

我尝试过以下方式:

package com.controller;

import static com.mns.utils.Constants.REGISTER_FAIL;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class DefaultSpringController {

      @RequestMapping
      public String forwardRequest(final HttpServletRequest request) {
         return "redirect:/" + REGISTER_FAIL;
      }

}

我的应用程序上下文如下:

    <!-- Default to DefaultSpringController -->
     <bean id="defaultSpringController"  class="com.controller.DefaultSpringController">
     </bean>

  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="defaultHandler" ref="defaultSpringController"/>
  </bean

但不断收到以下错误:

nested exception is java.lang.ClassNotFoundException: com.controller.DefaultSpringController

我不确定我在这里缺少什么,控制器是在正确的包中。

我知道如何实现它吗?

提前致谢

3 个答案:

答案 0 :(得分:5)

看起来,你想要一个找不到全局页面的处理程序。

@ControllerAdvice
public class GlobalExceptionContoller {

    @ExceptionHandler(NoHandlerFoundException.class)
    public String handleError404(HttpServletRequest request, Exception e) {
        return "pageNotFoundViewNameGoesHere";
    }

}

答案 1 :(得分:2)

您可以在web.xml设置无效url的配置。请注意,无效url通常会抛出404错误页面。

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

如果还不够,您可以从此错误页面转到控制器方法。但我通常将此配置用于错误页面而不是服务器端代码。还有许多其他替代方法取决于您的技术使用方式,但这种方式可以减少您的代码。

答案 2 :(得分:1)

如果您定义ExceptionHandler,请注意,/login/blabla之类的错误请求不会引发NoHandlerFoundException,因为后缀模式数学为activated by default。< / p>

因此,仅定义ExceptionHandler并不足以捕获所有错误请求。

在这种情况下,请按照以下步骤操作:

第一步。配置您的应用程序为/login/blabla SuffixPattern + TrailingSlashMatch )等未映射的调用抛出异常:

@Configuration
public class WebAppMainConfiguration extends WebMvcConfigurerAdapter {  

    @Override 
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // will throw NoHandlerFoundException
        configurer.setUseSuffixPatternMatch(false);
        configurer.setUseTrailingSlashMatch(false);
    }

    [...]
}

第二步。定义异常处理程序:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoHandlerFoundException.class)
    public Object handleException(NoHandlerFoundException ex, HttpServletRequest request) {
        [...]
        ex.printStackTrace();
        return "error";
    }

}