【SpringBoot】实现自定义异常处理

【SpringBoot】实现自定义异常处理

1. 背景

  • 当用户输入的url不合法时,页面会给出以下提示;
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing
this as a fallback.
Tue Nov 29 10:48:26 CST 2016 There was an unexpected error (type=Bad
Request, status=400). Required String parameter ‘fileName’ is not
present
  • 显然以上提示对用户不友好,因此需要根据不同的错误类型,自定义为用户返回更加友好的提示。

2. 具体实现

2.1 BasicErrorController

  • 新建BasicErrorController 继承 ErrorController(org.springframework.boot.autoconfigure.web)
  • 实现getErrorPath()方法;
  • 编写handleError()方法处理不同的状态码;
  • BasicErrorController.java 如下。
@Controller
public class BasicErrorController implements ErrorController {

    @Override
    public String getErrorPath() {
        return "/error";
    }

    /**
     * request error handler.
     * @param request request
     * @return model name
     */
    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        if (status != null) {
            Integer statusCode = Integer.valueOf(status.toString());

            if (statusCode == HttpStatus.NOT_FOUND.value()) {
                return "/404.html";
            } else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
                return "/500.html";
            } else if (statusCode == HttpStatus.BAD_REQUEST.value()) {
                return "/400.html";
            }
        }
        return "/error.html";
    }

}

2.2 静态文件

  • 静态文件存放位置为 src/main/resources/static
  • 具体如下图所示;
    image-20220506133405815
  • 在404.html中可以自定义返回内容,例如:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
404静态错误
</body>
</html>

2.3 测试

  • 新建TestController,增加合法接口/now;
@Controller
public class TestController {

    @RequestMapping("/now")
    @ResponseBody
    public String now(){
        return "2022-05-06";
    }
}
  • 访问/now接口;
    image-20220506133520030
  • 其他非法接口,如/test;
    image-20220506133600576
  • 至此实现了根据错误类型自定义返回页面;

2.4 注意点

  • ErrorControllerorg.springframework.boot.autoconfigure.web 下的接口;
package org.springframework.boot.autoconfigure.web;

public interface ErrorController {
    String getErrorPath();
}
  • spring-boot-autoconfigure 依赖如下;
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>1.5.15.RELEASE</version>
</dependency>
  • 依赖无法导入或其他问题建议降低spring-boot-starter-parent版本

2.5 参考

### 实现自定义异常处理Spring Boot 项目中,为了更好地管理和响应应用程序中的各种异常情况,可以通过创建一个被 `@ControllerAdvice` 注解标记的类来实现全局异常捕获机制[^1]。 此类不仅能够统一管理不同控制器抛出的各种未预期状况,而且支持跨多个控制层共享相同的异常处理器逻辑。下面是一个简单的例子展示如何构建这样的组件: #### 创建自定义异常类 首先定义一些特定业务场景下的异常类型,以便更精确地区分不同的错误情形并给予相应的反馈信息。 ```java public class ResourceNotFoundException extends RuntimeException { public ResourceNotFoundException(String message) { super(message); } } ``` #### 构建全局异常处理器 接着编写带有 `@ControllerAdvice` 和 `@ExceptionHandler` 方法注解的 Java 类用于集中处理这些预定义好的异常对象以及其他任何未经预料的情况。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<?> handleResourceNotFound(ResourceNotFoundException ex){ Map<String, Object> body = new HashMap<>(); body.put("message", "资源不存在:" + ex.getMessage()); return new ResponseEntity<>(body, HttpStatus.NOT_FOUND); } @ExceptionHandler(Exception.class) public ResponseEntity<?> handleError(HttpServletRequest req, Exception ex){ Map<String, Object> body = new LinkedHashMap<>(); body.put("path", req.getServletPath()); body.put("message", ex.getMessage()); return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 上述代码片段展示了两个具体的异常处理函数:一个是专门针对 `ResourceNotFoundException` 这种已知类型的;另一个则是作为兜底措施,适用于所有其他未知类型的异常实例。每当发生对应类型的异常时,Spring 将会调用相应的方法返回给前端用户友好的提示消息以及HTTP状态码[^2]。 此外,如果希望进一步增强默认情况下提供的错误详情页面或JSON响应体的内容,则可以考虑扩展 `DefaultErrorAttributes` 抽象基类来自定义额外的信息字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值