项目作者: rangwea

项目描述 :
exception to http code and http response message
高级语言: Java
项目地址: git://github.com/rangwea/spring-exception-handler.git
创建时间: 2019-08-18T11:31:56Z
项目社区:https://github.com/rangwea/spring-exception-handler

开源协议:

下载


API应该使用HTTP状态码还是全部返回200?

  1. 全部返回200,然后通过自定义HTTP response body来定义不同的错误类型。
  2. 遵循HTTP的响应码,按不同的错误返回相应的HTTP状态码。

那么哪种方案更好的呢?这个问题在stackoverflow知乎v2ex都有大量的讨论帖。在此不争论。

本人其实更倾向于第二种方案。首先HTTP作为通用标准,是更容易遵循的,也更容易理解的,自定义的code在小组,小部门好规范,但是再大就不容易规范了。其次业界大部分的通用框架都是会兼容HTTP标准的。以前做监控系统,规范的HTTP响应码,会使收集的Nginx访问日志更具有实际意义。很多分布式调用链框架一般也遵循HTTP协议来处理错误,自定义错误码一般就需要自身再做额外的扩展。

本项目就是基于SpringBoot异常处理机制来将异常统一转换成相应的HTTP状态码作为响应。同时在异常时返回相应的消息体。

使用异常而非返回码 —- 《代码整洁之道》

调用方法中遇到错误立刻抛出异常很方便,而且代码会很整洁,代码逻辑也不会被错误处理搞乱。那些繁琐的状态码转换就交给通用工具去完成吧。我们只关心异常。

所以你只需要做以下事情:

一、引入maven包

二、EnableAutoExceptionHandler

在SpringBoot启动类上添加@EnableAutoExceptionHandler

  1. @SpringBootApplication
  2. @EnableAutoExceptionHandler
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. }

三、抛出异常

  1. throw new NotFoundException(ErrorType.NOT_FOUND);

四、自定义ErrorType

可以通过实现ErrorType接口来自定义错误类型。建议使用enum在定义错误类型。可以参考项目CommonError的实现。

  1. public enum CommonError implements ErrorType {
  2. REQUEST_ERROR("000001", "request error"),
  3. SERVER_ERROR("000002", "server error")
  4. ;
  5. private String code;
  6. private String message;
  7. CommonError(String code, String message) {
  8. this.code = code;
  9. this.message = message;
  10. }
  11. @Override
  12. public String code() {
  13. return this.code;
  14. }
  15. @Override
  16. public String message() {
  17. return this.message;
  18. }
  19. }

五、选择异常类

BadRequestException: 400

UnauthorizedException: 401

ForbiddenException : 403

NotFoundException: 404

ConflictException: 409