Создание WSClient с Java с использованием PlayWS — Materializer null

По сути, я пытаюсь создать собственный WSClient в своем приложении SBT с использованием Java. Поскольку мне не нужны никакие зависимости от внедрения, я использую метод, показанный в документация. Чтобы создать собственный WSClient, ему нужен объект Akka.stream.Materializer, но, поскольку он абстрактный, я не могу создать объект Materializer.

private Materializer materializer;


private WSClient wsClient() throws IOException {

    scala.Option<String> noneString = scala.None$.empty();
    WSClientConfig wsClientConfig = new WSClientConfig(
            Duration.apply(120, TimeUnit.SECONDS), // connectionTimeout
            Duration.apply(120, TimeUnit.SECONDS), // idleTimeout
            Duration.apply(120, TimeUnit.SECONDS), // requestTimeout
            true, // followRedirects
            true, // useProxyProperties
            noneString, // userAgent
            true, // compressionEnabled / enforced
            SSLConfigFactory.defaultConfig());

    AhcWSClientConfig clientConfig = AhcWSClientConfigFactory.forClientConfig(wsClientConfig);

    // Add underlying asynchttpclient options to WSClient
    AhcConfigBuilder builder = new AhcConfigBuilder(clientConfig);
    DefaultAsyncHttpClientConfig.Builder ahcBuilder = builder.configure();
    AsyncHttpClientConfig.AdditionalChannelInitializer logging = new AsyncHttpClientConfig.AdditionalChannelInitializer() {
        @Override
        public void initChannel(io.netty.channel.Channel channel) throws Exception {

        }
    };
    ahcBuilder.setHttpAdditionalChannelInitializer(logging);
    // #ws-custom-client

   
    WSClient customWSClient = new play.libs.ws.ahc.AhcWSClient(ahcBuilder.build(), materializer);
    // #ws-client

    // #ws-close-client
    customWSClient.close();
    return customWSClient;
}

Примечание. Я не хочу использовать внедрение зависимостей

Как мне поступить с этим?


person Akila Randil    schedule 14.07.2016    source источник
comment
Прежде всего, почему вы пытаетесь избежать внедрения зависимостей? Вот как сейчас работает фреймворк. Почему вы пытаетесь этого избежать?   -  person marcospereira    schedule 14.07.2016
comment
Потому что я разрабатываю API, который должен работать на платформе. Поэтому, если я создам отдельное игровое приложение, я буду запускать игровое приложение внутри игрового приложения.   -  person Akila Randil    schedule 15.07.2016


Ответы (1)


Из документов Akka Streams:

akka.actor.ActorSystem system = play.libs.Akka.system();
akka.stream.Materializer materializer = akka.stream.ActorMaterializer.create(system);

Имейте в виду, что play.libs.Akka.system() устарел и будет удален в будущем.

person marcospereira    schedule 14.07.2016
comment
Выдает такую ​​ошибку. java.lang.RuntimeException: нет запущенного приложения. Также говорится, что Akka.system устарела. - person Akila Randil; 15.07.2016
comment
Ага. Как я уже сказал в ответе, play.libs.Akka.system() устарел в пользу использования DI (который вы не хотите использовать). Об исключении, как вы запускаете код? Это приложение Play или изолированное? - person marcospereira; 15.07.2016
comment
Это изолированный. - person Akila Randil; 17.07.2016
comment
Так что вам тоже нужно создать свой собственный ActorSystem. См. ActorSystem.create. методы. - person marcospereira; 18.07.2016