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 客户端
在下面的代码中,当端点 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