问题描述:
写程序,难免会遇到一些异常。遇到了,处理了,给与友好提示就ok,Spring Boot 默认自己就处理了异常,只是感觉有点不友好:
浏览器访问:
Postman 接口获取:
页面不怎么友好,然后返回Json格式的时候,可能和自己系统里面的数据返回格式不一致,这里就需要自己处理下了。
解决方案:
方法1.自定义错误页面
最简单的,根据源码可知:
在 error 文件夹下面可以根据 状态码来找页面。
此error 文件夹需要放在 springboot 的根目录下创建 error文件夹,然后放 404.html,500.html 等等。
不过这里,我建议最好放在 src/main/resources/templates/目录下,因为这里是 thy 的默认模板目录,可能把错误信息显示出来。
此时访问就是 404/500 去你定义的文件位置了。
此方法错误信息显示不详细,不能返回json数据,不建议使用。
方法2.@ControllerAdvice + @ExceptionHandle 注解处理异常
@ControllerAdvice public class ErrorController { @ExceptionHandler(value = {Exception.class}) @ResponseBody public Object error(){ Map<String,String> map = new HashMap<>(); map.put("error", "出错了"); return map; } }
@ExceptionHandler里面的value 的值是一个数组可以各个定义各种异常,可以返回json也可以返回 modelAndView
但是这种处理方式处理不了 404,如果想通过这种方式处理,则需要在配置文件里面添加
spring.mvc.throw-exception-if-no-handler-found=true spring.resources.add-mappings=false
但是这两句代码添加之后,又会导致静态资源不可使用。
方法3.配置 SimpleMappingExceptionResolver
@Configuration public class ErrorController { /** * 该方法必须要有返回值。返回值类型必须是: SimpleMappingExceptionResolver */ @Bean public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){ SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver(); Properties mappings = new Properties(); /*** 参数一:异常的类型,注意必须是异常类型的全名 * 参数二:视图名称 */ mappings.put("java.lang.ArithmeticException", "error1"); mappings.put("java.lang.NullPointerException","error2"); //设置异常与视图映射信息的 resolver.setExceptionMappings(mappings); return resolver; } }
此方案和第二种方案类似,不建议使用。
【推荐】方法4.继承 ErrorController + @ControllerAdvice + @ExceptionHandle 处理一切异常
已知@ControllerAdvice + @ExceptionHandle可以处理 除 404 以外的 运行异常,那么,捕获不到的异常就是404了。
两个类:
NotFoundException
@Controller public class NotFoundException implements ErrorController { @Override public String getErrorPath() { return "/error"; } @RequestMapping(value = {"/error"}) @ResponseBody public Object error(HttpServletRequest request) { Map<String, Object> body = new HashMap<>(); body.put("error", "not found"); body.put("code", "404"); return body; } }
ExceptionController
@ControllerAdvice public class ExceptionController { @ExceptionHandler(value = {Exception.class}) @ResponseBody public Object error(Exception ex){ Map<String,String> map = new HashMap<>(); map.put("error", ex.getMessage()); map.put("code", "500"); return map; } }
自己定义方法,想返回什么就返回什么,无论是 html 还是json,
运行效果如下
完美O(∩_∩)O
摘自: