如何与Spring一起制作一个异步REST?
我正在尝试使用Spring Boot制作一个小的REST。我以前从未使用过Spring,很久以前就使用过Java(Java 7)!
在过去的2年里,我只使用Python和C#(但就像我说的,我已经使用了Java)。
所以,现在,我正在尝试使用异步方法制作REST,并检查了几个例子,但是,我仍然不太理解这样做的“正确方法”。
查看以下文档:http://carlmartensen.com/completablefuture-deferredresult-async,Java 8具有我可以与Spring一起使用的功能,因此,我编写了以下代码:CompletableFuture
服务:
@Service
public class UserService {
private UserRepository userRepository;
// dependency injection
// don't need Autowire here
// https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-spring-beans-and-dependency-injection.html
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Async
public CompletableFuture<User> findByEmail(String email) throws InterrupedException {
User user = userRepository.findByEmail(email);
return CompletableFuture.completedFuture(user);
}
}
存储库:
public interface UserRepository extends MongoRepository<User, String> {
@Async
findByEmail(String email);
}
休息控制器:
@RestController
public class TestController {
private UserService userService;
public TestController(UserService userService) {
this.userService = userService;
}
@RequestMapping(value = "test")
public @ResponseBody CompletableFuture<User> test(@RequestParam(value = "email", required = true) String email) throws InterruptedException {
return userService.findByEmail(email).thenApplyAsync(user -> {
return user;
})
}
}
此代码为我提供了预期的输出。然后,查看另一个文档(抱歉,我丢失了链接),我看到Spring接受以下代码(这也给了我预期的输出):
@RequestMapping(value = "test")
public @ResponseBody CompletableFuture<User> test(@RequestParam(value = "email", required = true) String email) throws InterruptedException {
return userService.findByEmail(email);
}
}
这两种方法之间有区别吗?
然后,查看以下指南:https://spring.io/guides/gs/async-method/,课堂上有一个注释。如果我包含注释并创建一个像上一个链接中的代码一样的Bean,我的应用程序在端点上不会返回任何内容(只有200 OK响应,但带有空白正文)。@EnableAsync
SpringBootApplication
@EnableAsync
asyncExecutor
/test
那么,我的休息是异步的,没有注释?为什么当我使用时,响应正文是空白的?@EnableAsync
@EnableAsync