wicketとdropwizard,guiceを連携する


wicket guice glassfish の組み合わせでアプリ構築をしていたのですが、
glassfishだとデプロイが遅い(ような気がした)ため、
組み込みTomcatで動かしたくなり、Spring BootがDropwizardか迷ったあげく、
wicket guice dropwizard の組み合わせで動くようにしてみました。

作成したコード一式は、Githubに置きました。
dropwizard-wicket-guice


1. 参考にしたサイト



2. QuickStart



3. dropwizard-wicketのFolk後に実施したこと


3.1. build.gradleの設定、編集


3.1.1. MavenプロジェクトをGradleプロジェクトに変換

Folk元のプロジェクトがMavenプロジェクトのため、Gradleプロジェクトへ変換を行いました。

    gradle init --type pom

3.1.2. build.gradleのdependenciesの記述を以下の記述に変更

dropwizardとwicketのversionは新しいものに変更し、
guiceと、guice-servlet,wicket-guiceを依存関係に追加しました。

    dependencies {
        compile group: 'io.dropwizard', name: 'dropwizard-core', version:'0.8.4'
        compile group: 'org.apache.wicket', name: 'wicket-core', version:'7.1.0'
        compile group: 'com.google.inject', name: 'guice', version:'4.0'
        compile group: 'com.google.inject.extensions', name: 'guice-servlet', version:'4.0'
        compile group: 'org.apache.wicket', name: 'wicket-guice', version:'7.1.0'
    }

3.1.3. plugin記述にshadowを追加して、shadowjarタスクを使用可能にする。

pluginの記述

    plugins {
      id 'java' // or 'groovy' Must be explicitly applied
      id 'com.github.johnrengelman.shadow' version '1.2.2'
    }

shadowJarタスクの記述

    shadowJar {
      // jar作成後がコマンド再実行でjarを再生成するため、記述を追加
      tasks.clean.execute()
      mergeServiceFiles() 
      exclude 'META-INF/*.DSA'
      exclude 'META-INF/*.RSA'
    }

3.2. Folk元のプログラムの変更点


3.2.1. WicketBundleの記述を変更

Folk元のクラスは、Guiceを使用しない実装だったので、
WicketBundle.javaの以下の点を修正しました。

  1. FilterHolderに設定するFilterクラスをGuiceFilterに変更。
  2. contextにGuiceServletConfigの設定する処理を追加。
  3. SessionHandlerの設定処理を追加。

SessionHandlerは設定しないと、

java.lang.IllegalStateException: No SessionManager ! 
at org.eclipse.jetty.server.Request.getSession(Request.java:1402)
とエラーとなったため追加しました。
※深い理由はよくわかりません。


3.2.2. SampleApplicationの追加

アプリ起動のために追加。


4. 作ったあとの感想


GuiceFilter経由で、WicketFilterの設定?とInjectorの取得しているのが、
結構面倒くさく、意味がぱっと見でわかりにくい気がしました。
Folk元だと、WicketBundleにWicketのApplicationクラスを設定して、 インスタンス生成する作りになっていましたが、そのへんをInjector経由での生成にすると、
GuiceFilter使わなくても、やりたいことは実現できそうな気がしますが、
そこは思っただけで実現していません。

5. 後日談

wicket guicecomponentinjectorはcustominjectionsを無視する をご参照ください。
※捕足説明となります。

コメント