2008年9月5日金曜日

wicket-seam連携最初の一歩

2008/09/09追記: この手順はよろしくありません。新しいエントリを参考にして下さい。

前提とする環境

  • Maven2がインストール済みである事。
  • JBossAS 4.2.3GAをインストール済みである事。
  • Eclipse Ganymede for JavaEE Developersがインストール済みである事。
    • さらに、このEclipseに上記JBossASのServer構成を追加済みである事。

まずはWicketのProjectを作成する

  1. http://wicket.apache.org/quickstart.html
    にある、wicket-archetype-quickstartプラグインを使ったmavenコマンドの自動生成機能を使ってwicketのprojectを生成する。
  2. 生成されたprojectフォルダに移動し、pom.xmlに修正を加える。
    1. dependencies要素に以下を追加。
      <!-- seam-wicket -->
      <dependency>
        <groupId>org.jboss.seam</groupId>
        <artifactId>jboss-seam</artifactId>
        <version>2.1.0.BETA1</version>
      </dependency>
      <dependency>
        <groupId>org.jboss.seam</groupId>
        <artifactId>jboss-seam-wicket</artifactId>
        <version>2.1.0.BETA1</version>
      </dependency>
      <!-- EJB3 -->
      <dependency>
        <groupId>javax.ejb</groupId>
        <artifactId>ejb-api</artifactId>
        <version>3.0</version>
      </dependency>
      <!-- JPA -->
      <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0</version>
      </dependency>
    2. build/plugins要素に以下を追加。
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <downloadSources>true</downloadSources>
          <downloadJavadocs>true</downloadJavadocs>
          <wtpversion>2.0</wtpversion>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/webapp/WEB-INF</directory>
              <targetPath>WEB-INF</targetPath>
              <filtering>true</filtering>
            </resource>
          </webResources>
        </configuration>
      </plugin>
    3. project要素直下に以下を追加。
      <repositories>
        <repository>
          <id>repository.jboss.org</id>
          <name>JBoss Repository</name>
          <url>http://repository.jboss.org/maven2</url>
        </repository>
      </repositories>
  3. 生成されたprojectフォルダで、$ mvn eclipse:eclipse -DdownloadSources=true を実行し、EclipseからImportする。EclipseのDynamic Web ProjectとしてImportされるはず。
  4. src/main/webapp/WEB-INFにcomponents.xmlを作成する。中身は以下のように記述する。
    <?xml version="1.0" encoding="UTF-8"?>
    <components xmlns="http://jboss.com/products/seam/components"
                xmlns:wicket="http://jboss.com/products/seam/wicket"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation=
                    "http://jboss.com/products/seam/wicket http://jboss.com/products/seam/wicket-2.1.xsd
                     http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd">
        <wicket:web-application application-class="com.shin1o.WicketApplication" />
    </components>
  5. src/main/webapp/WEB-INF/web.xmlの、display-name要素より下を以下に置き換える。
    <listener>
      <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
    </listener>
    <filter>
      <filter-name>Seam Filter</filter-name>
      <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>Seam Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
  6. WicketApplication.javaのSuperClassをorg.apache.wicket.protocol.http.WebApplicationからorg.jboss.seam.wicket.SeamWebApplicationに変更する。ここがミソ。これはSeamと連携するための入り口となる部分なのだ。
    1. そのままだとprotected Class getLoginPage()の実装が必要になるので、中身をreturn getHomePage();とかで実装しておく。
  7. Projectの「Run As - Run on Server」で、JBoss4.2用のサーバ構成にデプロイし、起動する。
  8. コンソールにだらだらーっとログが表示されて、最後の方にいつもの「WARNING: Wicket is running in DEVELOPMENT mode.」みたいなのが見えるはず。
  9. ブラウザでhttp://localhost:8080/プロジェクト名、で動作を確認する。

課題

  • とりあえず、ここで書いた状態だと全然Seamを使ってないので、ちょっとくらい使ってみるエントリも書く。
  • Eclipse JEEもJBossASも重いから、こいつら使わずになんとならんものか。Jettyみたいなカンジでサクサク、といけばいいんだけど。
  • このシンプルな何も無い状態で、WicketTesterが動作しない。
    ERROR - RequestCycle - Can't instantiate page using constructor public com.shin1o.HomePage(org.apache.wicket.PageParameters) and argument
    org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor public com.shin1o.HomePage(org.apache.wicket.PageParameters) and argument
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:168)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:66)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:262)
    仕組み的に、何か工夫する必要があるのは当然だとは思うが、今はちょっとわからない。WicketTesterがあってこそ、ブラウザでの動作確認とか手間な事せずにサクサク開発できるのに、これはないだろー。WicketTesterはどーすりゃ動くんだ?もしも、どーあがいてもWicketTesterが使えないという事になったなら、SeamWicket連携なんてうんこ。カス。価値がない。絶対に使う事は無い。

とにかく、WicketTesterが動作するにはどうすりゃいいのかを見つけないと話にならんが、しばらくは触ってみる。また、このページの内容は、今後はWikiにてメンテしていきます。

追記

WicketTesterが実行できない件で、なんでWicket単独で落ちてるんだろう?と思ったら、Caused Byが下に出てました。
Caused by: java.lang.NullPointerException
at org.jboss.seam.wicket.WicketComponent.getInstance(WicketComponent.java:109)
  at org.jboss.seam.wicket.SeamAuthorizationStrategy.isInstantiationAuthorized(SeamAuthorizationStrategy.java:49)
  at org.apache.wicket.Application$1.onInstantiation(Application.java:276)
  at org.apache.wicket.Application.notifyComponentInstantiationListeners(Application.java:974)
  at org.apache.wicket.Component.(Component.java:874)
  at org.apache.wicket.MarkupContainer.(MarkupContainer.java:105)
  at org.apache.wicket.Page.(Page.java:236)
  at org.apache.wicket.markup.html.WebPage.(WebPage.java:184)
  at com.shin1o.HomePage.(HomePage.java:21)
  ... 36 more

コメントを投稿