2015-09-14 4 views
1

Как настроить весну для работы с типами возвратов 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, но ... работает!

Так что мой оригинальный метод имеет следующую логику:

  1. перебрать Коллекция
  2. Сделать асинхронный вызов через AsyncRestTemplate для каждого элемента коллекции
  3. Позвонить каждое CompletableFuture в коллекции
    • thenApply (результат преобразования)
    • thenCompose (введите новый async cal l с таблицей AsyncRestTemplate)
    • thenApply (результат преобразования)
    • В конце я перехожу к списку преобразований к завершению, как описано here.

Казалось, что трансформация будущего является неправильным. Может ли быть так, что будущая цепь слишком длится? Есть идеи?

+0

Это должно быть доступно по умолчанию. Отправьте ошибки/журналы, которые вы получаете на сервере. (Как редактирование не как комментарии!). –

+0

Обновлено. В журналах нет erros, но я сделал несколько экспериментов, может ли это помочь. – Cherry

ответ

0

Проблема заключалась в том, что линии:

@RequestMapping(path = "/" ... 

При изменении его

@RequestMapping(path = "/1" ... 

будущего завершения вдруг стали работать.

P.S. Я сломал все свои мысли, прежде чем обнаружил, что проблема действительно в сопоставлении. Может помочь кому-то O :-)

Смежные вопросы