Groovy で JSF を使ってみる その2

前回からの続き

erudoru.hatenablog.com

CDI の設定

JSF に Bean 管理の仕組みは用意されていますが、CDI を使ったほうがいろいろ便利なような気がするので追加していきます。

実装は Weld を使用します。Jetty 上で使用するので weld-servlet-core を追加します。サーバ起動時にエラーが発生したので jetty-servlet を追加しましたが若干微妙です。この辺はもう少し依存関係を調べる必要がありそうです。

build.gradle

dependencies {
    〜
    compile 'org.jboss.weld.servlet:weld-servlet-core:3.1.0.Final'
    providedCompile 'org.eclipse.jetty:jetty-servlet:9.4.15.v20190215'
    〜
}

大体の設定は自動で行ってくれますが、CDI を有効にするために beans.xml を追加する必要があります。

src/main/webapp/WEB-INF/beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

おそらく通常の IDE での開発であればこれで OK っぽいんですが、Gradle メインでビルドする場合もうひと手間必要になります。

CDI の仕様(?)で beans.xml が「WEB-INF」直下に、ビルドされたクラスファイルが「WEB-INF/classes」に配置されないと Bean が認識されないっぽいです。

そのためビルド時のクラスファイルの出力先を WEB-INF 直下に変更します。

build.gradle

sourceSets.main.output.classesDir = file("build/inplaceWebapp/WEB-INF/classes")
sourceSets.main.output.resourcesDir = file("build/inplaceWebapp/WEB-INF/classes")

Bean の設定

アノテーションCDI に変更します。それ以外は特に変更はありません。

src/main/groovy/HelloWorld.groovy

//@javax.faces.bean.ManagedBean // 削除
@javax.inject.Named(value = 'helloWorld') // 追加
public class HelloWorld implements Serializable { // Serializable を実装

  def firstName = "John"
  def lastName = "Doe"

  def showGreeting() {
    return "Hello ${firstName} ${lastName}!";
  }
}

セッションタイムアウトの追加

単位は「分」です。

src/main/webapp/WEB-INF/web.xml

  <session-config>
      <session-timeout>1</session-timeout>
  </session-config>

src/main/groovy/HelloWorld.groovy

@javax.inject.Named(value = 'helloWorld')
@javax.enterprise.context.SessionScoped // 追加
public class HelloWorld {
    〜
}