Как настроить весну для работы с типами возвратов CompletionStage
? Рассмотрим код:Как процесс CompletionStage с пружиной?
@RequestMapping(path = "/", params = "p", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CompletionStage<List<MyResult>> search(@RequestParam("p") String p) {
CompletionStage<List<MyResult>> results = ...
return results;
}
У меня есть 404, но я вижу в журнале, что этот метод срабатывает. Если изменить подпись так:
@RequestMapping(path = "/", params = "p", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<MyResult> search(@RequestParam("p") String p) {
CompletionStage<List<MyResult>> results = ...
return results.get();
}
Я вижу преуспевающим массив JSON.
Как сделать CompletionStage
работает с пружиной (4.2.RELEASE)?
ОБНОВЛЕНО
Для теста я написал следующие методы:
@RequestMapping(path = "/async")
@ResponseBody
public CompletableFuture<List<MyResult>> async() {
return CompletableFuture.completedFuture(Arrays.asList(new MyResult("John"), new MyResult("Bob")));
}
И это работает. Оо
У меня есть тест этой версии будущего:
@RequestMapping(path = "/async2")
@ResponseBody
public CompletableFuture<List<MyResult>> async2() {
AsyncRestTemplate template = new AsyncRestTemplate();
//simulate delay future with execution delay, you can change url to another one
return toCompletable(template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
.thenApply(
resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
.thenApply(
resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
.thenApply(
resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
.thenApply(
resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
.thenApply(
resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
.thenApply(resp -> Arrays.asList(new MyResult("John"), new MyResult("Bob")));
}
НЕМНОГО Agly, но ... работает!
Так что мой оригинальный метод имеет следующую логику:
- перебрать Коллекция
- Сделать асинхронный вызов через AsyncRestTemplate для каждого элемента коллекции
- Позвонить каждое CompletableFuture в коллекции
thenApply
(результат преобразования)thenCompose
(введите новый async cal l с таблицей AsyncRestTemplate)thenApply
(результат преобразования)- В конце я перехожу к списку преобразований к завершению, как описано here.
Казалось, что трансформация будущего является неправильным. Может ли быть так, что будущая цепь слишком длится? Есть идеи?
Это должно быть доступно по умолчанию. Отправьте ошибки/журналы, которые вы получаете на сервере. (Как редактирование не как комментарии!). –
Обновлено. В журналах нет erros, но я сделал несколько экспериментов, может ли это помочь. – Cherry