0

我正在使用 Spring Boot 2.0 并在 an 中有一个@RestController返回 a的端点,DeferredResult并且在某些情况下(例如,如果不需要计算所需的值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

结果似乎一开始写得正确,但由于某种原因,一个空的 ModelAndView 被返回给 servlet。

什么可能导致这种情况?

4

2 回答 2

3

你有使用etag吗?我们发生了这种情况并添加

ShallowEtagHeaderFilter.disableContentCaching(request); 

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

于 2019-09-11T20:15:44.343 回答
0

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

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

@ResponseBody注解告诉控制器返回的对象自动序列化为 JSON 并传回 HttpResponse 对象。

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

于 2018-09-24T12:31:47.447 回答