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

标签 spring spring-boot error-handling

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

对于错误情况,我们的服务将以简单的JSON格式进行响应。例如,如果参数格式错误,我们将以HTTP状态400和JSON进行响应:

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

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

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

最佳答案

这取决于您的项目规模。如果许多应用程序都使用您的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时,便可以捕获所有内容。在两种情况下(小应用程序或大应用程序),都应使用上面显示的方式开始错误处理。

关于spring - 是否所有HTTP错误响应都具有相同的JSON结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56694668/

相关文章:

c++ - 相同的未更改代码是否可能有时运行有时不运行?

r - 函数运算符检查第一个函数参数是否为空 df

java - 如何远程调试在同一容器中运行的两个具有相同代码库但具有不同配置文件的 Spring Boot 应用程序?

java - Spring hibernate : reload entity mappings

java - Spring Boot 属性迁移器

spring-boot - 无法通过 VPN 通过计算机名称访问 Rest Endpoint

java - Thymeleaf 无法检测到 spring-boot 项目中的模板

java - BufferedOutputStream java :The constructor BufferedOutputStream(FileOutputStream) is undefined 错误

python - 简单的套接字调用返回socket.gaierror : [Errno 8]

java - 检查 Thymeleaf 中的 If-Else