Я пытаюсь сделать небольшой REST, используя Spring Boot. Я никогда не использовал Spring и не использовал Java давным-давно (Java 7)!
За последние 2 года я использовал только Python и С# (но, как я уже сказал, я уже использовал Java).
Итак, сейчас я пытаюсь создать REST с использованием асинхронных методов и проверил несколько примеров, но все же я не очень хорошо понимаю "правильный способ" сделать это.
Глядя на следующую документацию: http://carlmartensen.com/completablefuture-deferredresult-async, Java 8 имеет CompletableFuture
который я могу использовать с Spring, поэтому я сделал следующий код:
Служба:
@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:
@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/, есть аннотация @EnableAsync
в классе SpringBootApplication
. Если я @EnableAsync
аннотацию @EnableAsync
и создаю asyncExecutor
подобный коду из последней ссылки, мое приложение не возвращает ничего в конечной точке /test
(только ответ 200 OK, но с пустым телом).
Итак, мой отдых асинхронный без аннотации @EnableAsync
? И почему, когда я использую @EnableAsync
, тело ответа пустое?