直接设置延迟结果不return一个主体

Directly setting deferred result does not return a body

我正在使用 Spring Boot 2.0 并且在 @RestController 中有一个端点 returns 和 DeferredResult 并且在某些情况下(例如,如果想要的值 [= =33=]not 需要计算)它直接在 DeferredResult 上设置结果,如下所示:

  @RequestMapping(value = "test")
  public DeferredResult<String> test() {
    DeferredResult<String> returnValue = new DeferredResult<>();
    returnValue.setResult("Hello, World");
    return returnValue;
  }

很遗憾,返回的 HTTP 正文是空的。状态代码 200 表明请求确实 没有 超时,如果我向延迟结果添加完成处理程序,也会调用该处理程序。

当我显式创建一个新线程并在一小段休眠期后在其上设置结果时,该问题也未解决。

我必须更改什么才能让 DeferredResult 实际上正确序列化?

编辑:

按照评论中的建议,我打开了 Spring MVC 的调试日志记录并发现了以下日志消息:

DEBUG org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor - Written [ok] as "text/plain" using [org.springframework.http.converter.StringHttpMessageConverter@6b634d28]
DEBUG org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request

一开始结果似乎是正确的,但后来由于某种原因向 servlet 返回了一个空的 ModelAndView。

这可能是什么原因造成的?

我相信您必须将 @ResponseBody 添加到您的方法中:

@RequestMapping(value = "test")
public @ResponseBody DeferredResult<String> test() {
  DeferredResult<String> returnValue = new DeferredResult<>();
  returnValue.setResult("Hello, World");
  return returnValue;
}

The @ResponseBody annotation tells a controller that the object returned is automatically serialized into JSON and passed back into the HttpResponse object.

https://www.baeldung.com/spring-request-response-body

你有使用电子标签吗?我们发生了这种情况并添加了

ShallowEtagHeaderFilter.disableContentCaching(request); 

控制器方法似乎解决了这个问题。