Wicket Guice GlassFish の組み合わせでアプリ構築をしていたのですが、GlassFish 4.x だとデプロイが遅いです。
12
この遅さ対策のため 組み込み Tomcat でアプリケーションを動かしたくなりました。
Spring Boot が Dropwizard か迷ったあげく、
Wicket Guice Dropwizard の組み合わせで動くようにしてみました。
実施したこと、作成したアプリケーションについて記載します。
1. 作成したコード
作成したコード一式は、Github に置きました。
2. 参考
-
dropwizard-wicket
Dropwizard と Wicket を連携している Example コードです。
この Example を Folk して作成しました。 -
Wicket + Guice including unittests
Wicket と Guice を 連携している Example が記載されています。 -
gradleでDropwizard
Dropwizard の pom.xml を gradle に書き換える際に参考にさせてもらいました。 -
Wicketのquickstartプロジェクト(Maven)をGradleに移行する
Wicket の pom.xml を gradle に書き換える際に参考にさせてもらいました。
3. QuickStart
とりあえず、動かしたいのであれば、以下 QuickStart で動作させることができます。
4. dropwizard-wicket の Folk 後に実施したこと
Example コードを Flok した後に実施したことを記載します。
4.1. build.gradle の 設定、編集
Maven プロジェクトを Gradle プロジェクトに変換
Folk 元のプロジェクトが Maven プロジェクトのため、Gradle プロジェクトへ変換を行いました。
Maven プロジェクト Gradle プロジェクト の変換は以下のコマンドで実施できます。
gradle init --type pom
build.gradle の dependencies の 変更
Dropwizard Version を 0.8.4
に、 Wicket Version を 7.1.0
に 変更し、guice 、guice-servlet、 wicket-guice を依存関係に追加しました。
- dependencies の抜粋
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' }
plugin 記述に shadow
を追加して、shadowjar
タスクを使用可能にする。
Gradle で Fat jar を作成するための plugin 、Gladle Shadow plugin を 追加します。
-
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' }
4.2. プログラムの変更点について
プログラムの変更点について記載します。
WicketBundle の記述を変更
Folk 元のクラスは、Guice を使用しない実装でしたので、WicketBundle.java の以下の点を修正しました。
- FilterHolder に設定する Filter クラスを GuiceFilter に変更。
- context に GuiceServletConfig の設定する処理を追加。
- SessionHandler の設定処理を追加。
SessionHandler は設定しないと、以下の内容のエラーが出力されたので、追加しています。 3
- エラー内容
java.lang.IllegalStateException: No SessionManager ! at org.eclipse.jetty.server.Request.getSession(Request.java:1402)
SampleApplication の追加
Dropwizard は アプリ起動のため、io.dropwizard.Application
の継承クラスを作成する必要がありますが、Folk 元のコードが パーツのみの提供でした。
実際動作するアプリケーションにするため、SampleApplication.java
を追加しました。
5. 作ったあとの感想
以下、作成後に思ったことになります。
-
WicketFilter と、GuiceFilter の共存することがあまり直感的でない。
GuiceFilter 経由で、WicketFilter の設定 と Injector の取得をしています。
実装がそれなりに面倒で、直感的にもわかりにくい気がしました。 -
改善案
Folk 元だと、WicketBundle に Wicket の Application クラスを設定して、インスタンス生成する作りになっていました。
このインスタンス生成を Injector 経由での生成にすると、GuiceFilter 使わなくても、やりたいことは実現できそうな気がします。
これは、思っただけで実現していません。
6. 後日談
後日、動作確認中にアノテーションを使った Custom Injection に失敗する問題に遭遇しました。
以下にまとめていますので、よろしければご確認ください。
wicket guicecomponentinjectorはcustominjectionsを無視する
-
実施ていた当時はそのように感じました。 ↩
-
そして、GlassFish 5.0 がリリースされています。 ↩
-
深い理由はわからなかったですが、“No SessionManager” - Google グループ を参考に追加しました。 ↩
コメント