Wicket Guice GlassFish の組み合わせでアプリ構築をしていたのですが、GlassFish 4.x だとデプロイが遅いです。
12

この遅さ対策のため 組み込み Tomcat でアプリケーションを動かしたくなりました。
Spring Boot が Dropwizard か迷ったあげく、
Wicket Guice Dropwizard の組み合わせで動くようにしてみました。 実施したこと、作成したアプリケーションについて記載します。


1. 作成したコード

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


2. 参考


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 の以下の点を修正しました。

  1. FilterHolder に設定する Filter クラスを GuiceFilter に変更。
  2. context に GuiceServletConfig の設定する処理を追加。
  3. 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を無視する


  1. 実施ていた当時はそのように感じました。 

  2. そして、GlassFish 5.0リリースされています。 

  3. 深い理由はわからなかったですが、“No SessionManager” - Google グループ参考に追加しました。 

コメント