如何在 spring mvc 中的操作之前发送响应

2023-11-26

假设我的 spring 控制器函数接收大量数据。 鉴于数据结构正确,我想返回 200 OK,并且在那之后我想执行处理,这可能需要一段时间。

据我了解,发送响应的唯一方法是return命令。但我不想在响应发送时结束该功能。

还有其他方法可以在函数中间向客户端发送响应吗?

创建一个新的线程运行是显而易见的,但其他语言(JS)可以让您更优雅地处理它。

@RequestMapping(value = Connectors.CONNECTOR_HEARTBEAT, method = RequestMethod.POST)
public ResponseEntity<String> doSomething(@RequestBody List<Message> messages) {
    HttpStatus code = (messages!=null && !messages.isEmpty()) ? HttpStatus.OK
            : HttpStatus.NOT_FOUND;
    return new ResponseEntity<String>(res, code);
   // how do I add code here??
}

当然,您可以在发送响应后进行处理。更通用的方法是使用afterCompletion的方法HandlerInterceptor。通过构造,它将在响应发送到客户端后执行,但它迫使您将逻辑分成两个组件:before控制器中的一部分,以及after拦截器中的一部分。

另一种方法是忘记 Spring MVC 机制并在控制器中手动提交响应:

@RequestMapping(value = Connectors.CONNECTOR_HEARTBEAT, method = RequestMethod.POST)
public void doSomething(@RequestBody List<Message> messages, HttpServletResponse response) {
    int code = (messages!=null && !messages.isEmpty()) ? HttpServletResponse.SC_OK
            : HttpServletResponse.SC_NOT_FOUND;
    if (code != HttpServletResponse.SC_OK) {
        response.sendError(code, res);
        return;
    }
    java.io.PrintWriter wr = response.getWriter();
    response.setStatus(code);
    wr.print(res);
    wr.flush();
    wr.close();

    // Now it it time to do the long processing
    ...
}

请注意 void 返回代码,以通知 Spring 响应已在控制器中提交。

另一个优点是,处理仍然发生在同一个线程中,因此您可以完全访问会话范围的属性或 Spring MVC 或 Spring Security 使用的任何其他线程局部变量...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 spring mvc 中的操作之前发送响应 的相关文章

随机推荐

  • 创建静态和共享 C++ 库

    我想建立静态库和共享库在一个项目中 我知道需要从使用 fpic 编译的对象创建共享库以获得位置无关代码 而静态库不需要这个 这一切都很好 我可以创建共享库或静态库 我不想编译我的源代码两次以获得不同的目标文件 那么这通常是如何完成的 我读如
  • Linux,第一次读取或第一次写入时会清零页面页错误吗?

    我的问题是 Linux 特定的 需要了解内核 虚拟内存 mmap 页面错误 我有一个带有大型静态数组的 C 程序 它将进入 bss 部分 内存 初始化为零 当程序启动时 这块内存并没有物理分配 只有虚拟内存 虚拟内存的每一页都映射到特殊的零
  • iOS 将文件从主包复制到文档目录

    我正在尝试将添加到名为 includes 的文件夹中的文件复制到文档目录上也称为 includes 的文件夹中 我得到的值为零resContents Why void copyResources NSString sourcePath NS
  • 流式传输实时音频

    我想在 Android 设备上具有实时音频流的功能 它通过设备的 MIC 捕获音频并将其发送到服务器 我知道在录制后发送音频文件 但如果是实时的 我需要帮助 也许可以通过不断向服务器发送字节数组来完成 如果是的话 如何或是否有其他方式 请分
  • TypeError: Type str 不支持 buffer API # find 方法?

    这是我的输入 div class content div class stream item header a class account group js account group js action profile js user p
  • Apple A4 上的 YUV 到 RGBA,我应该使用着色器还是 NEON?

    我正在使用 OpenGL ES 和 ffmpeg 为 Apple TV 编写媒体播放器框架 在 OpenGL ES 上渲染需要转换为 RGBA 使用 swscale 进行软转换速度慢得难以忍受 所以根据网上的信息我想出了两个想法 使用 ne
  • 从 Spark (pyspark) 管道内的 StringIndexer 阶段获取标签

    我在用Spark and pyspark我有一个pipeline设置了一堆StringIndexer对象 我用它来将字符串列编码为索引列 indexers StringIndexer inputCol column outputCol co
  • 在 TypeScript 中,当类型是函数的参数时,是否有办法限制 Partial 类型的额外/多余属性?

    是否有一种标准方法可以让场景 1 因未指定已知属性而出现编译错误 就像场景 2 中一样 或者有一些解决方法吗 class Class2 g number class Testing static testIt3
  • RabbitMQ 的最大消息大小

    发布到 RabbitMQ 队列 发布 订阅模型 时消息的最大大小是多少 我在文档中看不到任何明确的限制 但我认为有一些指导方针 提前致谢 我正在做比较亚马逊队列服务 and RabbitMQ或其他流媒体 消息平台 如 kinesis kaf
  • 为什么 Javascript 内置方法/函数是用 C/C++ 而不是 JS 语法编写的

    这个问题是参考这个老问题在哪里可以找到 javascript native functions source code 该页面上的答案说 源代码位于c or c 但我很好奇为什么来源 定义 是这些语言 我的意思是它们是 JS 函数定义 例如
  • 分离一些次要情节,但不分离其他次要情节; Python、Matplotlib

    我正在 python v 2 7 9 中使用 matplotlib v 1 4 2 绘制子图网格 我可以手动调整子图之间的间距 但我希望仅某些子图具有不同的间距 我希望的最终图形是左侧有一个 2x5 子图网格 右侧有一个 2x5 子图网格
  • 如何“平行”组合镜头

    我是优秀的新手Control Lens我正在尝试将两个镜头 并行 而不是按顺序 组合起来 就像我对 Control Arrow 所做的那样 如果我以lens文档 data Foo a Foo baz Int bar Int a 我希望能够做
  • 如何从存档安装 stringi 库并安装本地 icu52l.zip

    我们正在笨手笨脚地让一些 R 代码在生产环境中工作 作为其中的一部分 我们安装了一些 R 包 如下所示 Default directories and mirrors WORKING DIR lt srv foo bar baz LIB D
  • 完全信任 Visual Studio 2012 和 .Net 4.0 的 UNC 共享

    每次我尝试打开位于 UNC 共享上的解决方案时 我都会收到以下对话框 我尝试过使用caspol exe汉塞尔曼谈论的效用here 但似乎不起作用 至少对于在 Visual Studio 2012 中运行的 Net 4 项目来说不是 使用相同
  • Android:我可以在服务中使用 Google Analytics吗?

    我有一个应用程序 大部分时间作为服务在后台运行 网上有很多关于如何使用 Google Analytics API 和 EasyTracker 库来跟踪多个活动的示例和教程 但没有一个示例和教程解释了如何在服务中使用 Google Analy
  • Chrome 和 Firefox 中带有换行符的文本区域的最大长度验证不同

    问题是 Firefox 将换行符视为 1 n 字符 而 Chrome 将它们视为 2 r n 这就是我得到的textarea with maxlength 10 这是10字符为Firefox 1234 5 6 7 这是10字符为Chrome
  • PHP 中唯一的临时文件名?

    我需要将一些文件转换为 PDF 然后将它们附加到电子邮件中 我在电子邮件方面使用 Pear Mail 这很好 大多数情况下仍在解决一些问题 但作为此过程的一部分 我需要创建临时文件 现在我可以使用临时南 函数 但听起来它在文件系统上创建了一
  • Rails 3.2.2 不执行 rjs

    我正在关注这本书使用 Rails 进行实用敏捷 Web 开发第 4 版 但我使用的是 Rails 3 2 2 而不是书中推荐的 3 0 5 ruby v ruby 1 9 3p125 2012 02 16 i686 linux rails
  • Vim textwidth 逗号缩进问题

    如果我在 Vim 中设置以下选项 set textwidth 80 文本将在 80 个字符处中断 这可行 但问题是如果逗号 位于行尾 Vim 会缩进下一行 我可以做什么来避免这种行为 您可能启用了 C 风格缩进 set nocindent应
  • 如何在 spring mvc 中的操作之前发送响应

    假设我的 spring 控制器函数接收大量数据 鉴于数据结构正确 我想返回 200 OK 并且在那之后我想执行处理 这可能需要一段时间 据我了解 发送响应的唯一方法是return命令 但我不想在响应发送时结束该功能 还有其他方法可以在函数中