Java 如何在Spring中向REST响应添加子状态(错误代码)?

Java 如何在Spring中向REST响应添加子状态(错误代码)?,java,spring,rest,Java,Spring,Rest,我在RESTful应用程序中使用Spring,当访问被拒绝时,我抛出一些HTTP401异常 本质上,我只是抛出一个或多个异常,其注释如下: @ResponseStatus(value = HttpStatus.UNAUTHORIZED) 返回如下内容: { "timestamp": 1434805699008, "status": 401, "error": "Unauthorized", "message": "[ERR:02-011] Access to '/use

我在RESTful应用程序中使用Spring,当访问被拒绝时,我抛出一些HTTP401异常

本质上,我只是抛出一个或多个异常,其注释如下:

@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
返回如下内容:

{
   "timestamp": 1434805699008,
   "status": 401,
   "error": "Unauthorized",
   "message": "[ERR:02-011] Access to '/user/account/{id}' is rejected!",
   "path": "/user/account/{id}"
}
{
   "timestamp": 1434805699008,
   "status": 401,
   "code": 12011,
   "error": "Unauthorized",
   "message": "[ERR:12-011] Access to '/user/account/{id}' is rejected!",
   "path": "/user/account/{id}"
}
问题是抛出HTTP 401有很多子原因,比如API-KEY格式错误、API-KEY无效(不是十六进制、太短、太长)、API-KEY过期等等

我希望客户端能够解析这样的子状态。我希望能够收到这样的东西:

{
   "timestamp": 1434805699008,
   "status": 401,
   "error": "Unauthorized",
   "message": "[ERR:02-011] Access to '/user/account/{id}' is rejected!",
   "path": "/user/account/{id}"
}
{
   "timestamp": 1434805699008,
   "status": 401,
   "code": 12011,
   "error": "Unauthorized",
   "message": "[ERR:12-011] Access to '/user/account/{id}' is rejected!",
   "path": "/user/account/{id}"
}
其中将有一个“
code
”属性可供客户端使用。我不想求助于解析字符串消息,比如我的“[ERR:02-011]”,这是一种糟糕的做法

我尝试用一个
AbstractWebException
扩展我的所有异常,它有一个
code
变量,并使用适当的getter和setter方法。但这似乎并没有与异常的其余部分一起序列化(不太清楚原因)

我想保持简单

谢谢你的建议和帮助


一些代码:

public abstract class AbstractWebException extends RuntimeException {

   private static final long serialVersionUID = 1L;
   private int errorCode = 0;

   public AbstractWebException(String message) {
      super(message);
   }

   public AbstractWebException(int errorCode, String message) {
      super(message);
      setErrorCode(errorCode);
   }

   public void setErrorCode(int errorCode) {
      this.errorCode = errorCode;
   }

   public int getErrorCode() {
      return errorCode;
   }
}
。。。而且

/**
 * <b>HTTP 401 - Unauthorized</b>
 */
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
public class UnauthorizedException extends AbstractWebException {

   private static final long serialVersionUID = 1L;

   public UnauthorizedException(String message) {
      super(message);
   }
}
/**
*HTTP 401-未经授权
*/
@ResponseStatus(值=HttpStatus.UNAUTHORIZED)
公共类UnauthorizedException扩展了AbstractWebException{
私有静态最终长serialVersionUID=1L;
公共未授权异常(字符串消息){
超级(信息);
}
}

例外情况是什么?我只能显示易于“清理”且不会泄露客户信息和/或其知识产权的代码。例外代码。将异常转换为JSON主体的代码。啊,我想我看到了一些东西。控制器中抛出一个异常,其余的在过滤器中处理。似乎筛选代码使用的是“response.senderError(SC_BAD_REQUEST,“some message”)”而不是抛出UnauthorizedException。我尝试用抛出新的UnauthorizedException替换sendError(),但筛选器似乎正在用自己的异常覆盖异常。。。奇怪的某些组件(可能带有@ControllerAdvice注释)负责将异常转换为JSON响应体。这就是您需要更改的地方。是否有方法让筛选器将引发的异常返回给客户端。。。就像控制器那样?