Несколько вызовов WS в одном действии Java Play

1

Я разрабатываю Java 2 (v2.2.3) Java-приложение (с Java 8), задачей которого является получение данных из двух веб-сервисов и возврат скомпилированного результата.

С моего первого вызова WS я получаю объект массива JSON, позволяющий говорить списки вакансий. Теперь для каждой работы в этой коллекции я хочу назвать другой WS, который дает мне что-то вроде цены акций компании, предлагающей эту работу. В конце концов, я ожидаю, что мои действия вернут этот новый "расширенный" массив JSON, где наряду с каждым списком вакансий я также вижу цену акций.

Я начал собирать что-то вместе, и мне удалось вернуть список заданий, но каким-то образом часть, в которой я склеиваю два вызова, не работает/не вызывается.

public static Promise<Result> index() {
        final Promise<WS.Response> resultPromiseJobs = WS.url("https://jobs.github.com/positions.json?description=java").get();
        final Promise<Result> result = resultPromiseJobs.flatMap(response -> {
            JsonNode jobListings = response.asJson();
            // convert jobListings to a collection
            List<Job> jobs = ...
            // call map on this collection to fetch stock prices for each element
            jobs.stream().map(job -> {
               Promise<WS.Response> resultPromiseStock = WS.url("secondURL?someQuery=job").get()); // this also returns a promise
               // so let map it to something
               // ??? what to map to and how to convert all this to a 'Result'
               resultPromiseStock.map();
               ...
            });
        });
        return result; // what is the correct object to return here?
}

Это в основном тот же вопрос, но о Scala, меня интересует решение Java

  • 0
    вернуть resultPromise который был сопоставлен с Promise<Result>
  • 0
    @LimbSoup: Но тогда будет несовпадение типов: Promise <Result> и Promise <WS.Response>
Показать ещё 5 комментариев
Теги:
web-services
playframework-2.0

1 ответ

0

Из нашего чата я вижу, что вы хотите, чтобы вы отобразили каждый WS.Response в JsonNode, оставив вас с List<Promise<JsonNode>>. Promise.sequence можно использовать для преобразования этого List<Promise<JsonNode>> в Promise<List<JsonNode>>, который затем можно сопоставить с Promise<Result>.

public static Promise<Result> index() {
    final Promise<WS.Response> resultPromiseJobs = WS.url("https://jobs.github.com/positions.json?description=java").get();
    final Promise<Result> result = resultPromiseJobs.flatMap(response -> {
        JsonNode jobListings = response.asJson();

        List<Job> jobs = ...

        List<Promise<JsonNode>> jsonResultsPromise = jobs.stream().map(job -> {
           Promise<WS.Response> resultPromiseStock = WS.url("secondURL?someQuery=job").get()); // this also returns a promise
           // map this to the retrieved JsonNode
           resultPromiseStock.map(...);
        });

        // Convert the list of promises into a promise of lists
        Promise<List<JsonNode>> jsonResults = Promise.sequence(jsonResultsPromise);

        // Now map to Promise<Result>
        jsonResults.map(...);

    });
    return result;
}

Уловка здесь заключается в том, что если одно из Promise не завершится, весь список не удастся. Во многих случаях вы можете захотеть, чтобы это произошло, если вам нужны все результаты. Это достаточно просто, чтобы отбросить неудачное Promise из списка в Scala с помощью этого метода, но я не уверен, как это сделать на Java без fold.

  • 0
    Promise.sequence - это то, что я тоже хотел использовать, но на этом я получаю ошибку компиляции. Кроме того, не должен ли jobs.stream().map иметь возвращаемое значение?
  • 0
    В чем была ошибка компиляции?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню