読者です 読者をやめる 読者になる 読者になる

Jersey + CDIで@Contextが動かない

Jersey + CDIの構成で、ContainerRequestFilterの中でUriInfoを使おうとしてハマった。
構成は JAX-RS(Jersey) + JPA (on CDI) / on Tomcat - edgegram がベースでDeltaspikeを少々追加。

public class FormTypeFilter implements ContainerRequestFilter {
    @Context
    private UriInfo uriInfo;

    public void filter(ContainerRequestContext requestContext) throws IOException {
        System.out.println(uriInfo);
    }
}

UriInfoがnullにしかならない。ResourceInfoも試したが同様。
調べてもそんな事例なさそうだし(そもそもJersey + CDI自体情報少ないし)。


他のライブラリが影響しているのかと、色々抜き差しした結果、

  • 単純なJersey(jersey-container-servletだけ)にするとInjectされる
  • CDIを使おうとする(jersey-cdi1xを入れる)とnullになる

という所まで何とかこぎつける。
ただ、jersey-cdi1xがダメとなるとCDIが使えなくなる。

何か無いのか? とmarvenリポジトリを検索してみると、jersey-cdi1x-servletというのを発見。
jersey-cdi1xの代わりにjersey-cdi1x-servletを入れて試すと

・・・

UriInfo入った。ちゃんとInjectされている。
他の自前クラスも@Injectできているし、CDIコンテナも問題なく動いている様子。
正解かどうか分からないが、とりあえず動くのでいいことにする。

ハマり時間:8時間