【问题标题】:Spring DeferredResult setResult causing 404Spring DeferredResult setResult 导致 404
【发布时间】:2013-01-21 20:48:20
【问题描述】:

我正在使用新的 spring 3.2 异步 servlet 请求。 除了在这种情况下,一切都很好......

@RequestMapping("/test")
@ResponseBody
public DeferredResult<byte[]> test(InputStream is, HttpServletResponse response, WebRequest request) {
    if (someTest()) {
        deferredResult.setResult(DATA);
        return deferredResult;
    }

    deferredResult.onTimeout(new Runnable() {

        @Override
        public void run() {
            deferredResult.setResult(DATA);
        }
    });

    // Use deferredResult in another thread when needed

    return deferredResult;
}

someTest() 为真时,spring/tomcat 返回 404。我不确定我应该如何处理或为什么会发生这种情况?我认为这可能是因为已经创建了 Servlet 异步上下文。这是一个错误还是我做错了什么?

任何信息将不胜感激!

【问题讨论】:

  • 请查看在 Spring 上创建的 bug(已解决为无效)!他们面临着与您完全相同的问题!唯一的方法是在 Controller 服务方法之外设置 deferredResult。

标签: java spring spring-mvc


【解决方案1】:

我认为您需要从 if 条件中删除语句 return deferredResult

而且 setData 也应该在 return 语句之后完成。因此,您需要从某个服务器端事件的单独线程中执行此操作。

希望这对您有所帮助。

【讨论】:

  • 确实没有帮助,因为某些条件应该立即返回结果,而其他条件应该“停放”以供另一个线程使用。
【解决方案2】:

我想通了,见下文……

@RequestMapping("/test")
@ResponseBody
public DeferredResult<byte[]> test(InputStream is, HttpServletResponse response, WebRequest request) {
    if (someTest()) {
        response.getOutputStream().write(DATA);
        return null;
    }

    deferredResult.onTimeout(new Runnable() {

        @Override
        public void run() {
            deferredResult.setResult(DATA);
        }
    });

    // Use deferredResult in another thread when needed

    return deferredResult;
}

技巧是返回 null 并将响应手动写入 ServletResponse。

希望这对其他人有用:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2014-11-10
    • 2019-10-30
    • 1970-01-01
    • 2015-11-14
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多