Restful Api 错误处理

Bertha 。 2022-03-20 05:50 368阅读 0赞

目录描述

  • spring boot 中 默认的错误处理机制
    • 404
      • 浏览器访问
      • 非浏览器访问
      • 总结
      • 原理
    • 400
    • 方法内部错误
  • 自定义浏览器错误
    • 400
    • 500
  • 自定义非浏览器异常
    • 自定义异常的默认处理
    • 自定义异常的自定义处理

spring boot 中 默认的错误处理机制

  1. 在现在的前后端分离的项目中,我们的rest api 不仅会被浏览器访问,也会被非浏览器访问

404

对于一个错误的访问地址 http://127.0.0.1:8080/xxx

浏览器访问

在这里插入图片描述

非浏览器访问

在这里插入图片描述

总结

spring boot 错误处理 会对浏览器发出的请求返回html 页面
对 非浏览器发出的错误请求返回 json数据

404的message都为空

原理

核心类

  1. org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;

在这里插入图片描述
此类中只在类上面定义了一个映射路径,而在方法上没有定义具体的路径,所以这两个方法会处理同一个url,
不同之处是看请求头的accept 中是否带有 text/html ,如果带了就返回一个html页面,如果没有就返回json,
(同一个url不同情况做不同处理)

在这里插入图片描述

400

我们知道404 就是路径不存在 ,但有些情况下一个状态码不足以说明问题,如400


在这里插入图片描述
在这里插入图片描述
当有BindingResult errors 参数,验证不同过时则返回200


对于上面这个方法 如果没有 BindingResult errors 参数,当验证不同过时会直接被spring boot 档回去,返回400错误
在这里插入图片描述
用postman 请求这个方法http://127.0.0.1:8080/user
返回json数据

  1. {
  2. "timestamp": "2019-02-11T03:18:30.367+0000",
  3. "status": 400,
  4. "error": "Bad Request",
  5. "errors": [
  6. {
  7. "codes": [
  8. "MyConstraint.user.username",
  9. "MyConstraint.username",
  10. "MyConstraint.java.lang.String",
  11. "MyConstraint"
  12. ],
  13. "arguments": [
  14. {
  15. "codes": [
  16. "user.username",
  17. "username"
  18. ],
  19. "arguments": null,
  20. "defaultMessage": "username",
  21. "code": "username"
  22. }
  23. ],
  24. "defaultMessage": "这是一个validate测试",
  25. "objectName": "user",
  26. "field": "username",
  27. "rejectedValue": null,
  28. "bindingFailure": false,
  29. "code": "MyConstraint"
  30. },
  31. {
  32. "codes": [
  33. "NotBlank.user.password",
  34. "NotBlank.password",
  35. "NotBlank.java.lang.String",
  36. "NotBlank"
  37. ],
  38. "arguments": [
  39. {
  40. "codes": [
  41. "user.password",
  42. "password"
  43. ],
  44. "arguments": null,
  45. "defaultMessage": "password",
  46. "code": "password"
  47. }
  48. ],
  49. "defaultMessage": "密码不能为空",
  50. "objectName": "user",
  51. "field": "password",
  52. "rejectedValue": null,
  53. "bindingFailure": false,
  54. "code": "NotBlank"
  55. }
  56. ],
  57. "message": "Validation failed for object='user'. Error count: 2",
  58. "path": "/user"
  59. }

这下message也有值了

可见spring boot 对400的状态码会将错误信息收集到errors里面返回给用户

方法内部错误

对于400 404 我们的请求都没有进入方法里面就被spring boot 挡回去了

而更多的是方法内部错误的处理
在这里插入图片描述
对于这个方法

  • 浏览器请求
    在这里插入图片描述
    这下返回500 服务内部错误,错误消息就是我自己写的那个
  • 非浏览器访问
    在这里插入图片描述

自定义浏览器错误

400

在resources下建立resources文件夹,再创建error文件夹,最后创建404 html错误页面
在这里插入图片描述
在这里插入图片描述
运行 测试如下
在这里插入图片描述

这个只对浏览器有作用,非浏览器请求返回错误信息不会变

500

和404同理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义非浏览器异常

自定义异常的默认处理

  • 创建异常类
    在这里插入图片描述

    public class UserNotExistException extends RuntimeException{

    1. private static final long serialVersionUID = -3807424756736653437L;
    2. private String id;// 存放用户不存在的id
    3. public UserNotExistException(String id){
    4. super("user not exists ! ");
    5. this.id = id;
    6. }
    7. public String getId() {
    8. return id;
    9. }
    10. public void setId(String id) {
    11. this.id = id;
    12. }

    }

  • 使用

    /**

    1. * @param idxx
    2. * @return
    3. */
    4. @GetMapping("{id:\\d++}")
    5. @JsonView(User.UserSimpleView.class)
    6. public User getInfo4( @PathVariable(name = "id") String idxx){
    7. System.out.println("=================");
    8. throw new UserNotExistException(idxx);
    9. }
  • 测试

在这里插入图片描述

自定义异常的自定义处理

spring boot 默认情况下不会读错误消息以外的信息

那我们如何拿到异常中的id呢

  • 创建ControllerExceptionHandle

    /**

    • @version V1.0
    • @Package com.whale.web
    • @Description: 这个类只会处理其他controller抛出来的异常,不会处理请求
    • @date 2019/2/11 12:12
      */

    @ControllerAdvice
    public class ControllerExceptionHandle{

    1. @ExceptionHandler(UserNotExistException.class)
    2. @ResponseBody
    3. @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    4. public Map<String,Object> handleUserNotExeistException(UserNotExistException ex){
    5. Map<String,Object> result = new HashMap<>();
    6. result.put("id",ex.getId());
    7. result.put("messsage",ex.getMessage());
    8. return result;
    9. }

    }

  • 测试

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,368人围观)

还没有评论,来说两句吧...

相关阅读