Как Spring получает результат от конечной точки, которая возвращает объект CompletableFuture? - PullRequest
1 голос
/ 22 октября 2019

В приведенном ниже коде при достижении конечной точки getPerson ответом будет JSON типа Person. Как Spring преобразует CompletableFuture<Person> в Person?

@RestController
public class PersonController {

    @Autowired
    private PersonService personService;


    @GetMapping("/persons/{personId}" )
    public CompletableFuture<Person> getPerson(@PathVariable("personId") Integer personId) {

        return CompletableFuture.supplyAsync(() -> personService.getPerson(personId));
    }
}

1 Ответ

3 голосов
/ 22 октября 2019

Когда возвращается CompletableFuture, он запускает функцию асинхронной обработки Servlet 3.0, при которой выполнение CompletableFuture будет выполняться в другом потоке, так что поток сервера, который обрабатывает HTTP-запрос, может быть освобожден как можно быстрее. обрабатывать другие HTTP-запросы. (См. Серию блогов, начиная с this для получения подробной информации)

@ResponseBody, аннотированный на @RestController, заставит Spring преобразовать возвращенное значение метода контроллера (т.е. Person) через HttpMessageConverter , зарегистрированный внутри компании. Одной из его реализаций является MappingJackson2HttpMessageConverter , который далее делегирует Джексону сериализацию объекта Person в строку JSON и отправляет его обратно клиенту HTTP, записывая его в HttpServletResponse

...