是否所有HTTP错误响应都具有相同的JSON结构?

时间:2019-06-20 22:32:52

标签: spring spring-boot error-handling

我们正在使用Spring Boot开发REST服务,并且想知道每个错误响应是否都应具有相同的JSON结构?

对于错误情况,我们的服务以简单的JSON格式响应。例如,如果参数格式错误,我们将以HTTP状态SELECT * FROM users WHERE CONCAT(fname, lname, phone, email) LIKE '%Smi%514%John%' 和JSON进行响应:

400

{ "errorCode": 05, "message": "provided paramter XY is malformed" } 是我们的自定义代码ID。有人可能会争论这种设计是否好,但是它很简单并且可以被服务使用者轻松地处理。

现在,Spring Boot会自动创建一些错误响应。例如,对于errorCode并创建HTTP状态为TypeMismatchException的响应。但是,当然,这些自动生成的响应没有错误格式。

因此...我们遇到的情况是,服务使用者是否事先就不知道HTTP状态400,是否在主体中具有简单的JSON错误格式。我们应该真正覆盖所有Spring Boot默认异常处理以在每个响应中放入我们的格式,还是服务使用者应该吞下苦涩的药丸并确定是否使用简单的JSON格式?

1 个答案:

答案 0 :(得分:0)

这取决于您的项目规模。如果许多应用程序都使用您的API,则应采用“捕获所有内容并使用JSON格式”的方法。是的,您还有更多工作要做,但是当公司中的所有其他应用程序都可以使用您的标准方式时,它们可以节省大量时间。

在我参与的大多数项目中,我们也有一种“标准方法”来返回我们的错误响应(也是JSON):

@RestControllerAdvice
public class GlobalResourceExceptionHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalResourceExceptionHandler.class);

    // the class ValidationError contains the properties the json should contain.
    @ExceptionHandler(Exception.class)
    public List<ValidationError> exceptionHandler(Exception e, HttpServletResponse response) {
        LOGGER.warn("Exception thrown in a resource", e);
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return Collections.singletonList(new ValidationError(null, "unexpected exception"));
    }
}

您可以使用更多@ExceptionHandler个扩展类。

事实证明,这是一个很好的方法,因为它易于实现(对于小型应用程序),并且涉及很多方面。基本上,很多意味着与休息请求有关的一切。排除的是资源处理程序,它提供了angular-app和安全层。

更新: 结论:当您拥有许多应用程序使用的api时,便可以捕获所有内容。在两种情况下(小应用程序或大应用程序),都应使用上面显示的方式开始错误处理。