Spring Boot 错误处理

作者: 我是才子 | 来源:发表于2018-11-21 15:52 被阅读9次

还想看更多文章的朋友可以访问我的个人博客


spring boot 的默认处理

spring boot 未进入到Controller中的错误请求处理:

spring boot 对于数据校验错误的请求处理:

请求: PUT "/user/1"
测试数据:{ "id": 1, "username" : "@jincoco", "password": "123456",  "email": "jincoco@email.com", "birthday": 1542700692000 }
校验约束:username 字段必须是数字、字母或_的组合
image

由于测试错误为字段校验,需要上传数据,此处为PUT请求,尽模拟 APP 发送请求。

spring boot 进入到Controller中的错误请求处理:

spring boot 对于REST服务所抛出的异常处:理:

请求: GET "/user/jin"
抛出异常:UserNotFoundException("User not found")

浏览器访问:


image

模拟 APP 访问:


image

如何自定义错误处理?

针对 HTTP 状态码定义错误页面

仅对浏览器起作用

需要自己创建错误页面,以 HTTP 状态码为文件名称即可:


image

此时,再访问不存在的服务,服务器再遇到404错误时,便会默认定向到我们自己定义的页面并向浏览器返回:

image

模拟 APP 访问时,spring boot 仍然默认返回 json 数据:


image

针对服务器服务抛出的异常自定义处理:

例子中,Service层:

@Override
public User query(String username) {
    return userRepository.findByUsername(username).orElseThrow(() ->new UserNotFoundException(username));
}

也就是说,当查询用户不存在时,抛出UserNotFoundException异常:

public class UserNotFoundException extends RuntimeException {

    private final String identification;

    public UserNotFoundException(String identification) {
        super("User [" + identification + "] not found");
        this.identification = identification;
    }

    public String getIdentification() {
        return identification;
    }
}

要对服务所抛出的异常进行处理,需要在定义下面一个异常处理器:

@ControllerAdvice
public class ControllerExceptionHandler {

  @ResponseBody
  @ResponseStatus(HttpStatus.NOT_FOUND) //404
  @ExceptionHandler(UserNotFoundException.class)
  public Map<String, Object> handleUserNotFoundException(UserNotFoundException ex) {
      Map<String, Object> result = new HashMap<>();
      result.put("id", ex.getIdentification());
      result.put("message", ex.getMessage());

      return result;
  }

}

这里主要涉及三个关键注解:

  • @ExceptionHandler,指明被注解方法是对哪一类异常进行处理(单独使用,仅可处理所在Controller中的异常)
  • @ControllerAdvice,其实与Controller这类注解类似,也是一个@Component,其与ExceptionHandler配合使用可以在任意位置进行异常处理。
  • @ResponseStatus,指定返回 HTTP 状态码

在未进行异常处理时,我们通过 APP 访问GET: /user/jin时,得到的 HTTP 状态码是500,指服务器错误,且除了错误信息User [jin] not found外无其他数据。而经过异常处理器后,请求的结果如下:

image
很明显,服务器的相应结果已经按我所设想的返回了。

相关文章

  • 五、SpringBoot错误处理机制

    1、错误处理机制 1.1、Spring Boot默认的错误处理机制 如果是浏览器,则返回一个默认的错误页面: 如果...

  • Spring Boot 错误(异常)处理

    1.错误(异常)处理 默认错误处理 在servlet容器中,Spring Boot默认提供一个“/error”映射...

  • 五、SpringBoot Web应用-2 (error &

    1、错误处理机制 Spring Boot /error默认提供映射,以合理的方式处理所有错误,并在servlet容...

  • Spring Boot错误处理

    Spring Boot常见的错误处理方法有三种,在实际使用的过程中选择其中一种即可。 方法一:Spring Boo...

  • Spring Boot 错误处理

    还想看更多文章的朋友可以访问我的个人博客 spring boot 的默认处理 spring boot 未进入到Co...

  • spring boot 错误处理

    方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController 方法二:...

  • Spring Boot错误处理

    Spring Boot提供了两种类型的错误处理机制,一种是依赖于内嵌容器的ErrorPage机制;另外一种是基于S...

  • 教程

    Spring Boot 入门 Spring Boot Controller Spring Boot Servlet...

  • SpringBoot 入门

    Spring Boot 入门 1、Spring Boot 简介 Spring Boot 是为了简化 Spring ...

  • Spring Boot Admin实现服务监控

    Spring Boot Admin简介 SBA 全称 Spring Boot Admin Spring Boot ...

网友评论

    本文标题:Spring Boot 错误处理

    本文链接:https://www.haomeiwen.com/subject/guecqqtx.html