我们正在使用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格式?
答案 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时,便可以捕获所有内容。在两种情况下(小应用程序或大应用程序),都应使用上面显示的方式开始错误处理。