Непосредственная установка отложенного результата не возвращает тело - PullRequest
0 голосов
/ 24 сентября 2018

Я использую 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 Ответ

0 голосов
/ 24 сентября 2018

Я полагаю, вам нужно добавить @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

...