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

Spring 直接设置延迟结果不会返回正文,spring,spring-boot,deferred-result,Spring,Spring Boot,Deferred Result,我使用的是Spring Boot 2.0,在@RestController中有一个端点,它返回一个DeferredResult,在某些情况下(例如,如果不需要计算所需的值),它直接在DeferredResult上设置结果,如下所示: @RequestMapping(value = "test") public DeferredResult<String> test() { DeferredResult<String> returnValue = new D

我使用的是Spring Boot 2.0,在
@RestController
中有一个端点,它返回一个
DeferredResult
,在某些情况下(例如,如果不需要计算所需的值),它直接在
DeferredResult
上设置结果,如下所示:

  @RequestMapping(value = "test")
  public DeferredResult<String> test() {
    DeferredResult<String> returnValue = new DeferredResult<>();
    returnValue.setResult("Hello, World");
    return returnValue;
  }
起初,结果似乎写得正确,但由于某种原因,会将null ModelAndView返回到servlet


什么原因会导致这种情况?

我认为您必须在方法中添加
@ResponseBody

@RequestMapping(value = "test")
public @ResponseBody DeferredResult<String> test() {
  DeferredResult<String> returnValue = new DeferredResult<>();
  returnValue.setResult("Hello, World");
  return returnValue;
}
@RequestMapping(value=“test”)
public@ResponseBody DeferredResult test(){
DeferredResult returnValue=新的DeferredResult();
returnValue.setResult(“你好,世界”);
返回值;
}
@ResponseBody注释告诉控制器对象 返回的数据将自动序列化为JSON并传递回 HttpResponse对象


我认为您必须在方法中添加
@ResponseBody

@RequestMapping(value = "test")
public @ResponseBody DeferredResult<String> test() {
  DeferredResult<String> returnValue = new DeferredResult<>();
  returnValue.setResult("Hello, World");
  return returnValue;
}
@RequestMapping(value=“test”)
public@ResponseBody DeferredResult test(){
DeferredResult returnValue=新的DeferredResult();
returnValue.setResult(“你好,世界”);
返回值;
}
@ResponseBody注释告诉控制器对象 返回的数据将自动序列化为JSON并传递回 HttpResponse对象


您是否使用ETag?我们让这种情况发生,并添加

ShallowEtagHeaderFilter.disableContentCaching(request); 

对于控制器来说,这种方法似乎解决了这个问题

你们有ETag在用吗?我们让这种情况发生,并添加

ShallowEtagHeaderFilter.disableContentCaching(request); 

对于控制器来说,这种方法似乎解决了这个问题

我正在控制器中使用
@RestController
,以便自动添加注释。不幸的是,即使使用注释,它也不起作用。我对我的问题进行了更正确的编辑。配置中是否有@enablesync?我正在控制器中使用
@RestController
,以便自动添加注释。不幸的是,即使使用注释,它也不起作用。我对我的问题进行了更正确的编辑。配置中是否有@enablesync?如果不使用
DeferredResult
,为什么要对非异步的内容使用异步结果类型?我怀疑这是由于异步处理不是真正的异步,因为它是由同一个线程处理的。。。但这只是一种预感。您是否检查了调用
setResult
的结果?如果设置了值,它将返回
boolean
值。它应返回
true
。您可能希望为
org.springframework.web
启用调试日志记录,以查看在这种情况下异步请求会发生什么情况。这只是一个非常简明的示例,我们确实需要异步返回类型,在某些情况下,我们需要首先实际计算值(示例中未显示)。事实上,上面的代码在我的另一个项目中工作,因此我怀疑存在某种配置问题。我肯定会尝试调试日志记录。为什么非异步的东西需要异步返回值(这是我没有得到的部分)。感觉上我们想要统一控制器方法的返回类型,而不管它的实际结果是什么。我已经将您的代码复制并粘贴到我创建的控制器中,并使用@RestController annotation进行注释,每当我发送请求时,它都会返回响应“Hello,World”。请提供有关您使用的配置和注释的更多信息,并确保您的客户端通过不使用
DeferredResult
来接受“text/plain”响应类型,为什么要对非异步的内容使用异步结果类型?我怀疑这是由于异步处理不是真正的异步,因为它是由同一个线程处理的。。。但这只是一种预感。您是否检查了调用
setResult
的结果?如果设置了值,它将返回
boolean
值。它应返回
true
。您可能希望为
org.springframework.web
启用调试日志记录,以查看在这种情况下异步请求会发生什么情况。这只是一个非常简明的示例,我们确实需要异步返回类型,在某些情况下,我们需要首先实际计算值(示例中未显示)。事实上,上面的代码在我的另一个项目中工作,因此我怀疑存在某种配置问题。我肯定会尝试调试日志记录。为什么非异步的东西需要异步返回值(这是我没有得到的部分)。感觉上我们想要统一控制器方法的返回类型,而不管它的实际结果是什么。我已经将您的代码复制并粘贴到我创建的控制器中,并使用@RestController annotation进行注释,每当我发送请求时,它都会返回响应“Hello,World”。请提供有关您使用的配置和注释的更多信息,并确保您的客户端接受“text/plain”响应类型