直接设置延迟结果不返回正文

时间:2018-09-24 12:26:09

标签: spring spring-boot deferred-result

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

起初似乎正确地写入了结果,但是出于某种原因,然后将空的ModelAndView返回到servlet。

是什么原因造成的?

2 个答案:

答案 0 :(得分:1)

您是否正在使用etag?我们发生了这种情况,并添加了

ShallowEtagHeaderFilter.disableContentCaching(request); 

到控制器方法似乎可以解决此问题。

答案 1 :(得分:0)

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

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

@ResponseBody 注释告诉控制器该对象   返回的内容会自动序列化为JSON,然后传递回   HttpResponse对象。

Path.GetFullPath Reference.