7

Spring Web 3.2 带有一个DeferredResult用于异步请求处理的类。如果出现问题,它setErrorResult可以提供替代响应,但没有提供 http 错误代码的选项。

当然,必须可以控制失败请求的 http 响应代码。我如何使用新的 Spring api 来做到这一点?

4

3 回答 3

7

方法的文档说明setErrorResult了以下内容:

为 DeferredResult 设置一个错误值并处理它。该值可能是 Exception 或 Throwable 在这种情况下,它将被处理,就好像处理程序引发了异常一样。

我想通过设置一个Exception,您可能会触发一个异常处理程序,该处理程序返回您想要的代码。

于 2013-02-01T11:15:01.573 回答
2
deferredResult.setErrorResult(new Exception());

这将始终将 HTTP 响应代码设置为 500。为了更好地控制 HttpServletResponse.setStatus 似乎有效。

这将适用于user411180 的客户端

public DeferredResult<List<Point>> getMessages(@RequestParam int reqestedIndex, 
            final HttpServletResponse response) {

    final DeferredResult<List<Point>> deferredResult = new DeferredResult<>();
    deferredResult.onCompletion(...);
    deferredResult.onTimeout(new Runnable() {
        @Override
        public void run() {
            deferredResult.setErrorResult("Explanation goes here.");
            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); //or SC_NO_CONTENT
        }
    });

    longPollRequests.put(deferredResult, reqestedIndex);
    return deferredResult;
}
于 2014-12-03T07:27:37.163 回答
0

作为参数传递给的异常setErrorResult可以用@ResponseStatus. 例如创建自己的异常类:

  @ResponseStatus(HttpStatus.NOT_FOUND)
  class NotFoundException extends RuntimeException {
     // add your own constructors to set the error message
     // and/or cause. See RuntimeException for valid ctors 
  }
然后在您的代码中将它与您创建的构造函数一起使用,例如:
  deferredResult.setErrorResult(new NotFoundException(reason, cause));
于 2019-01-10T09:21:47.260 回答