我正在使用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。
是什么原因造成的?
答案 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对象。