【问题标题】:how to return a response body when header is missing in spring REST apispring REST api中缺少标头时如何返回响应正文
【发布时间】:2015-10-15 00:04:06
【问题描述】:

我正在将标头传递给 spring REST api,例如:

@RequestHeader(value="test-header")

header 对于 API 来说是强制性的,所以我不想让它成为可选的。 当没有传递标头时,对 API 的任何调用都会返回一个标准的 400 错误,指示请求在语法上是错误的,然后它不会进入 REST API。但是,我想构造一个正确的 ResponseBody 并为这个错误返回一个 json。我不确定执行此操作的最佳方法。我考虑过使用spring拦截器并检查此标头是否已通过,但是我不确定是否可以从此处创建响应体。至少我不知道该怎么做。

拦截器方法会为此工作吗?如果是,如何?如果没有,那么有哪些选择?有人可以帮忙吗?

更新:

REST API 是这样的:

public void methodA(@RequestHeader(value="test-header") String header, @RequestBody User user, HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
...
...

} 

当标头出现时,它将进入 REST API 并继续执行逻辑。但是,如果标头不存在,则它不会进入 API,只会返回标准 400 错误。

我写的拦截器是这样的:

public class XXXInterceptor extends HandlerInterceptorAdapter { 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
...
...
...

return true;
}

}

【问题讨论】:

  • 如果参数存在,如何处理请求?你的处理程序是什么样的?

标签: java spring spring-mvc interceptor spring-restcontroller


【解决方案1】:

STEP1:使用像@valid这样的spring验证器注解来验证你的请求。

第 2 步:编写您的自定义验证器类。它将负责检查标头并查看它是否具有值或具有预期值。

第 3 步:如果请求不正确,验证器会抛出您的自定义异常。

步骤 4: 编写您的异常处理程序类。在类中定义如果第 3 步中的异常被捕获,我必须返回什么响应。

有关Exception Handling in Spring的更多信息。

在我们当前的项目中,我们确实使用 java 拦截器来验证请求,但除此之外什么都没有。

【讨论】:

  • 但是我在哪里为这种情况定义异常处理程序?当它进入 REST API 时,我使用异常处理程序。但是,在这种情况下,由于缺少标头(这是强制性的),它甚至不会进入 REST API。那么,在哪里为这种情况定义异常处理程序呢?
  • 如果您有异常处理程序,则让您的处理程序捕获 400 异常并在处理程序中定义您要发送的响应。
  • 使用这种方法,我可以返回响应正文吗? - 基本上是一些我可能想要返回的带有更详细的具体信息的 json。另外,我正在寻找使用验证器的示例?如果您有一个包含类似参考的示例链接,请告诉我。感谢您的帮助
  • 在这个例子中,我没有看到任何自定义验证类。看起来它在参数中添加了@Valid,然后检查方法内部的错误,然后抛出异常。
【解决方案2】:

编写一个带有注解@ExceptionHandler 的方法,并使用ServletRequestBindingException.class,因为如果未命中会抛出此异常。您可以从此方法返回任何类型的对象。

例如

@ExceptionHandler(ServletRequestBindingException.class)
public ResponseEntity<ResponseObject> handleHeaderError(){

    ResponseObject responseObject=new ResponseObject();
    responseObject.setStatus(Constants.ResponseStatus.FAILURE.getStatus());
    responseObject.setMessage(header_missing_message);

    ResponseEntity<ResponseObject> responseEntity=new ResponseEntity<ResponseObject>(responseObject, HttpStatus.BAD_REQUEST);
    return responseEntity;
}

【讨论】:

    【解决方案3】:

    另一种方法是使用 Spring 拦截器 (HandlerInterceptorAdapter),正如您在问题中提到的那样,使用 @ControllerAdvice 并以 @ExceptionHandler 方法返回您的 JSON。

    看看下面的帖子:http://www.journaldev.com/2651/spring-mvc-exception-handling-exceptionhandler-controlleradvice-handlerexceptionresolver-json-response-example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-26
      • 2019-05-22
      • 2018-12-31
      • 2022-10-02
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多