我正在使用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
我不确定我在这里缺少什么,控制器是在正确的包中。
我知道如何实现它吗?
提前致谢
答案 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";
}
}