Spring Web 3.2 带有一个DeferredResult
用于异步请求处理的类。如果出现问题,它setErrorResult
可以提供替代响应,但没有提供 http 错误代码的选项。
当然,必须可以控制失败请求的 http 响应代码。我如何使用新的 Spring api 来做到这一点?
Spring Web 3.2 带有一个DeferredResult
用于异步请求处理的类。如果出现问题,它setErrorResult
可以提供替代响应,但没有提供 http 错误代码的选项。
当然,必须可以控制失败请求的 http 响应代码。我如何使用新的 Spring api 来做到这一点?
方法的文档说明setErrorResult
了以下内容:
为 DeferredResult 设置一个错误值并处理它。该值可能是 Exception 或 Throwable 在这种情况下,它将被处理,就好像处理程序引发了异常一样。
我想通过设置一个Exception
,您可能会触发一个异常处理程序,该处理程序返回您想要的代码。
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;
}
作为参数传递给的异常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));