Spring 如何从 returns CompletableFuture 对象的端点获取结果?

How does Spring get the result from an endpoint that returns CompletableFuture object?

在下面的代码中,当端点 getPerson 被命中时,响应将是 Person 类型的 JSON。 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));
    }
}

当返回CompletableFuture时,会触发Servlet 3.0的异步处理特性,CompletableFuture的执行将在其他线程中执行,这样处理HTTP请求的服务器线程就可以尽快释放以处理其他 HTTP 请求。 (详见this开始的一系列博文)

注释在@RestController上的@ResponseBody将导致Spring通过HttpMessageConverter registered internally. One of its implementation is MappingJackson2HttpMessageConverter转换控制器方法的返回值(即Person)这将进一步委托 Jackson 将 Person 对象序列化为 JSON 字符串,并通过将其写入 HttpServletResponse

将其发送回 HTTP 客户端