Jersey2のソースを読みながらJavaのジェネリクスの旅

Jersey2がどんな風にHK2を使って、DIをコントロールしてるんだろう?って気になって。なので、Jersey2のソースコード読んでみることにしました。何か分かんないことがあっても、うらがみさんがいるから、安心(๑•̀ㅂ•́)و✧


まずはゴールと、やらないことから。

ゴール

リクエストが来てからレスポンスを返すまでの基本的な流れを理解する。

やらないこと

Jersey2やJAX-RS 2.0全体の読み込みは、やらない。

はじめる前に

HK2って?と思って。さすがはすぬまさん、めっちょ分かりやすい。

HK2 の使い方(前編) - Programming Studio

HK2 の使い方(後編) - Programming Studio

ServletContainer

ってことで、子どもたちが背中に飛び乗ってくる土曜の昼間から、読み始めました。 org.glassfish.jersey.servlet.ServletContainer をServletFilterとして使うやり方があるので、そこから入ってみる。

jersey/ServletContainer.java at 2.22.1 · jersey/jersey · GitHub

ServletとしてもFilterとしても動くようになってる。のでフィルターとしては doFilter を見たら良さそう。色々やってるけど、結局 serviceImpl の中で webComponent の serviceImpl を呼び出してるすね。なかなか味のあるコードだなー。実装の理由をコメントで残してるのって読むときに助かるから良いね。

WebComponent

てことでWebComponentを読もう。

jersey/WebComponent.java at 2.22.1 · jersey/jersey · GitHubserviceImpl を見てみる。

final ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri, servletRequest.getMethod(),
        getSecurityContext(servletRequest), new ServletPropertiesDelegate(servletRequest));

initContainerRequest(requestContext, servletRequest, servletResponse, responseWriter);

appHandler.handle(requestContext);

お、うらがみさんが言ってたappHandlerが出てきた。appHandler読めたら目標達成できそうだなー。と思いつつ initContainerRequest を見たら、その中で RequestScopedInitializerProvider というものを使ってる。ふむ・・・。

RequestScopedInitializerProvider

ほんで DEFAULT_REQUEST_SCOPE_INITIALIZER_PROVIDER あたりをぼーっと見てて。「あ・・・これずっと避けてきてたやつや・・・」ってなりました。

private final Type REQUEST_TYPE = (new TypeLiteral<Ref<HttpServletRequest>>() {}).getType();
private final Type RESPONSE_TYPE = (new TypeLiteral<Ref<HttpServletResponse>>() {}).getType();

TypeLiteralを理解できるように頑張るか・・・。

ジェネリクスの旅

Nagiseさんの記事を読み読みφ(..)

すごいなぁ。

イマココ。

次回

ということで、次回はTypeLiteralの理解に進めそうです!良い一週間を!