我们正在使用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/