Непосредственная установка отложенного результата не возвращает тело

Я использую 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;
  }

К сожалению, возвращаемое тело 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.

Что может вызвать это?

1 ответ

У вас есть электронные теги? У нас это случилось, и мы добавили

ShallowEtagHeaderFilter.disableContentCaching(request); 

к методу контроллера, похоже, решила проблему.

Я считаю, что вы должны добавить @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

Другие вопросы по тегам