Непосредственная установка отложенного результата не возвращает тело
Я использую 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.