如果不是前后端分离,一般出了异常都很容易处理,直接跳转到相关的错误页面即可,现在前后端分离,出了异常,就不能再跳转到错误页面了,但是我们可以返回JSON呀!我们可以对服务端可能发生的异常进行统一处理。
举个栗子:
当管理员想要删除某一个角色的时候,如果该角色下尚有关联的用户或者资源,此时由于数据库中外键的约束会导致删除失败(我的业务逻辑就是如此,这里小伙伴不要和我扯cascade),当删除失败时,会抛出一个DataIntegrityViolationException异常,我将这种异常捕获后统一处理。
处理方式如下:
自定义异常处理类
自定义异常处理类CustomExceptionResolver,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class CustomExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse response, Object o, Exception e) { ModelAndView mv = new ModelAndView(new MappingJackson2JsonView()); Map map = new HashMap<>(); map.put("status", "error"); if (e instanceof DataIntegrityViolationException) { map.put("msg", "该角色尚有关联的资源或用户,删除失败!"); } mv.addAllObjects(map); return mv; } }
|
在这里接收到系统抛出的各种异常,判断异常的类型,根据不同的类型,返回不同的提示,当然,我这里只有一种情况。
将CustomExceptionResolver注册为一个Bean
将CustomExceptionResolver注册为Bean就比较简单了,可以直接在类上添加@Component注解,也可以通过Java进行配置,如下:
1 2 3 4 5 6 7
| @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Bean public CustomExceptionResolver customExceptionResolver() { return new CustomExceptionResolver(); } }
|
两种方式任选一。