Jersey ClientのRxサポートを軽〜く試す

Jersey 2.13がリリースされました。

リリースノートを見ると [JERSEY-2639] - Jersey Client - Add Support for Rx というのがあったので試してみましたん。

pom.xmlに突っ込むdependency

jersey-rx-clientの実装 には、

  • jersey-rx-client-guava
  • jersey-rx-client-java8
  • jersey-rx-client-jsr166e
  • jersey-rx-client-rxjava

があるっぽいですがRxJavaとかよく分かんないので今回はjava8で試します。

<dependency>
  <groupId>org.glassfish.jersey.ext.rx</groupId>
  <artifactId>jersey-rx-client-java8</artifactId>
</dependency>

クライアントコード

名前を渡したらこんにちは言ってくれるいつものリソースクラスがあったとします。

まずはふつうのJAX-RSクライアントのコード。

WebTarget target = ClientBuilder.newClient().target("http://localhost:8080/rest/hello");

String resp = target.queryParam("name", "world")
                    .request()
                    .get(String.class);

System.out.println(resp); //Hello, world!

うむ。普通。

次にRx板のコードです。

WebTarget target = ClientBuilder.newClient().target("http://localhost:8080/rest/hello");

CompletionStage<String> stage = RxCompletionStage.from(target)
                                    .queryParam("name", "world")
                                    .request()
                                    .rx()
                                    .get(String.class);

stage.thenAccept(s -> System.out.println(s)); //Hello, world!

ご覧の通り CompletionStage であれこれできるっぽいです。

まとめ

RxJava学ぼうかな。

ぬるぽ

あなたとぬるぽ。

拡張forループ

int[] xs = null;
for (int x : xs) {
}

配列・リストが null なら拡張forループでぬるぽっ!

アンボクシング

Integer x = null;
int y = x;

プリミティブラッパーをプリミティブにアンボクシングするときにぬるぽっ!

普通に数字の足し算とかしててぬるぽが出たらこれを疑います。

throw

UnsupportedOperationException e = null;
throw e;

nullthrow したら投げられる例外はぬるぽっ!

String switch

String x = null;
switch (x) {
}

String のswitch文でぬるぽっ!

try with resources

try (AutoCloseable x = null) {
}

try with resourcesで AutoCloseablenull なら close するときにぬるぽっ!には ならない

close の前に null チェックするようにコンパイルされます。

コンストラクタ

new Hoge(a -> a.x.length());

何の変哲も無いコンストラクタですが、ぬるぽっ!になるケースがあります。

class Hoge {

    final String x;

    public Hoge(Consumer<Hoge> c) {
        c.accept(this);
        this.x = "hoge";
    }
}

フィールド x はfinalなのにぬるぽになるというアレです。 コンストラクタ終わってないインスタンスはメソッドに渡さないでおきましょー。

メソッド実行

Hoge x = null;
x.foobar();

ぬるぽっ! にはならないケースがあります

これ。

class Hoge {

    static void foobar() {
    }
}

まあ実際はこんなコードに出会うことは無いでしょう。

無いでしょう。

本日のコード