SpringBoot2之全局异常处理并且如何捕获404异常

写程序,难免会遇到一些异常。遇到了,处理了,给与友好提示就ok,springboot 默认自己就处理了异常,只是感觉有点不友好,

浏览器访问:

postman 接口获取:

页面不怎么友好,然后返回json格式的时候,可能和自己系统里面的数据返回格式不一致,这里就需要自己处理下了。

这篇文章将介绍4种springboot 解决异常得方案。
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,

发表评论

电子邮件地址不会被公开。 必填项已用*标注