qingjiuquan 2019-06-26
这种方式是处理全局异常,只要有对应的异常抛出,就会使用这个bean进行处理。使用SimpleMappingExceptionResolver
的话,只要在springmvc配置文件中做如下声明就可以了。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <-- 默认的异常界面,如果不是特殊指定的异常,都显示这个界面 --> <property name="defaultErrorView" value="/exception/handle/errorGlobal" /> <-- 异常的名称,界面上可以使用这个来输出异常信息 --> <property name="exceptionAttribute" value="e" /> <-- 指定特殊异常,并为特殊异常指定特定的界面 --> <property name="exceptionMappings"> <props> <prop key="xyz.zeling.exception.handle.modules.exception.handle.UserNotFoundException">/exception/handling/errorUser</prop> </props> </property> </bean>
这个是全局异常,只要有对应的异常抛出,就会使用这个类进行处理。注意使用这种方式的话,需要使这个类成为bean,可以使用注解方式,也可以在spring配置文件中声明。这个例子使用的是注解的方式。
@Component public class GlobalExceptionHandlerAnother implements HandlerExceptionResolver { /** * 异常处理方法,ex就是程序抛出的异常 */ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { return new ModelAndView("/exception/handle/errorGlobal"); } }
这个也是全局异常,只要有对应的异常抛出,就会使用@ExceptionHandler
注解的方法进行处理,@ControllerAdvice
注解的类除了有处理异常的@ExceptionHandler
方法外,还有其它两个注解方法,感兴趣的同学可以自行研究。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception e) { System.out.println("打印异常信息:"); e.printStackTrace(); return new ModelAndView("/exception/handling/errorGlobal"); } }
@ResponseStatus
可以自定义返回状态码和提示信息。
使用方式,先自定义一个异常,并使用@ResponseStatus
注解
@ResponseStatus( value = HttpStatus.BAD_REQUEST, reason = "测试自定义返回码") public class UserNotFoundException extends Exception { private static final long serialVersionUID = -8695002135215307249L; public UserNotFoundException(String name) { super("User not found with name: " + name); } }
然后在你想抛出这个异常的地方进行抛出
if (user == null) { throw new UserNotFoundException(name); }
程序运行到这里之后,界面上就会返回一个自定义状态码和自定义提示信息。
PS:这个处理异常的方式会被@ControllerAdvice
处理方式覆盖掉,其它的全局处理异常会不会覆盖没测试过,如果有测过的同学麻烦帮忙评论告知。
这种方式处理的异常只针对于使用的那个Controller方法,使用方式:
@Controller @RequestMapping("/exception/handling") public class ExceptionHandleController { @RequestMapping("/main") public ModelAndView toMain() { return new ModelAndView("/exception/handling/main"); } /** * @description TODO * @date 2018年1月29日 下午11:50:58 * @param e 注解使用的异常,可以当作参数 * @return * @throws Exception */ @ExceptionHandler(UserNotFoundException.class) public ModelAndView handleException(UserNotFoundException e) { // 异常处理逻辑 // ... return new ModelAndView("/exception/handling/errorUser"); } }
有错误的地方麻烦评论指正一下哈,共勉。