不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2021-12-18 22:03:35  修改时间:2024-04-16 22:41:10  分类:Java框架/系统  编辑

问题描述:

写程序,难免会遇到一些异常。遇到了,处理了,给与友好提示就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

 

 

摘自:

SpringBoot 之全局异常处理==>附捕获404异常

从零搭建开发脚手架 Spring Boot捕获404异常