SeamFramework.orgCommunity Documentation
OC4J (Oracle Containers for Java) 11g (現時点では "Technology Preview" リリース) は、Oracle の JEE5 アプリケーションサーバーです。Seam アプリケーションは、OC4J にデプロイすることが可能ですが、構成の変更と依存関係の追加が必要になります。この章では、まさに何が必要であるかを説明します。Seam に同梱されている JEE5 ホテル予約サンプルアプリケーションのビルドとデプロイを説明するところから始めます。それから、seam-gen によって生成されるプロジェクトをデプロイします。 まず最初に、RichFaces の ajax コンポーネントと facelets を使用した基本的な seam-gen アプリケーションを動作させます。次にこのアプリケーションを、Drools を使用した Seam セキュリティ、Hibernate により提供されるJPA、MySQL データベースからのリバースエンジニアリングを使用した CRUD 自動アプリケーションへと拡張してゆきます。
最初にターゲットコンテナ - OC4J のインストールが必要です。 この章では、OC4J 11g Technology Preview (OC4J 10g ではありません) の使用が必要です。OC4J 11g は http://www.oracle.com/technology/tech/java/oc4j/11/ からダウンロードできます。以下は、OC4J 11g のインストール、起動、アクセス、終了の手順です。OC4J のインストールについてのさらなる情報については、OC4J と一緒に配布されている readme.txt や、OC4J インストールガイド (installation guide) 、リリースノート (release notes)を参照してください。
OC4J をダウンロードして解凍してください。
環境変数として $JAVA_HOME と $ORACLE_HOME が設定されていることを確認してください ($ORACLE_HOME は OC4J を解凍したディレクトリです)。 OC4J のインストールの詳細については、OC4J と一緒に配布された readme.txt を参考にしてください
$ORACLE_HOME/j2ee/home/applications ディレクトリにアプリケーション (ear/war) をデプロイしてください。
OC4J は、デフォルトではホットデプロイをサポートしていないことに注意してください。 これは、アプリケーションをデプロイするたびにサーバを再起動しなければならないことを意味します。
OC4J を起動してください。 $ORACLE_HOME/j2ee/home/java -jar -XX:MaxPermSize=256M oc4j.jar
上記のコマンドを使用して、デフォルトの PermGen メモリ設定を上書きしなければなりません。詳細は、 OC4J リリースノート を参照してください。
OC4J の初回起動時には、管理パスワードを設定するように求められます。
デプロイできればすぐに、http://localhost:8888/<your-app-path> にアクセスしてアプリケーションを確認できます。
サーバを停止するには、サーバを実行させているコンソールで CTRL-C を押します。
jee5/booking サンプルは、(JBoss AS 上で動作する) ホテル予約サンプルに基づいています。そのままで GlassFish 上で動作するように設計されていますが、OC4J 上でも簡単に動作させることができます。このサンプルは $SEAM_DIST/examples/jee5/booking にあります。
まずホテル予約サンプルの基本的な依存関係を調べます。この知識をもとに OC4J に必要となる追加の依存関係を調べます。
アプリケーションに依存関係を含める方法は、後の 項36.2.3. 「jee5/booking サンプルのビルド 」 で説明します。
jboss-seam.jar — EJB3 モジュールとして宣言します (Seam はコンテナ管理のトランザクションと連携する必要があるからです。そのため EJB3 ステートフルセッション Bean として実装されています) jboss-el.jar jboss-seam-ui.jar — Seam の JSF コントロールは Apache の commons-beanutils に依存していますjboss-seam-debug.jar
jsf-facelets.jar
richfaces-api.jar と richfaces-impl.jar と richfaces-ui.jar — これらは Apache commons-digester と commons-beanutils を必要とします Hibernate — もちろん JPA プロバイダとして (OC4J に同梱されて出荷される TopLink Essentials ではなく) Hibernate を使用します。
Hibernate を JPA プロバイダとして使用するためには、以下の jar が必要です。
hibernate.jar
hibernate-annotations.jar
hibernate-entitymanager.jar
hibernate-validator.jar
jboss-common-core.jar
commons-logging.jar
commons-collections.jar
サードパーティの jar — Seam とサンプルを実行させるには、さまざまな jar が必要になります。
javaasist.jar
dom4j.jar
cglib.jar
asm.jar
commons-beanutils.jar
commons-digester.jar
concurrent.jar
log4j.jar — log4j を構成しないのであれば、これは省略できます。アーカイブに含めても構成しないのであれば、OC4J に隠蔽されてしまいます。
追加の OC4J jar — 通常のアプリケーションサーバー (例えば JBoss AS や Glassfish) で Seam を実行するには、単に実際に使用する Seam 機能の依存関係のみを含めれば十分です (例えば Seam テキストを使用するためには ANTLR を含む必要があります)。しかし OC4J では、 "面白い" クラスローディング機能のために、以下のものを必ず含める必要があります。
hibernate-search.jar
hibernate-common-annotations.jar — Hibernate search に必要 lucene-core.jar — Hibernate search に必要 antlr.jar — Seam テキストに必要 jbpm-jpdl.jar — Seam JBPM に必要 quartz.jar
dbunit.jar — テスト用クラスに必要 jboss-embedded-api.jar — テスト用クラスに必要 Drools — Seam セキュリティのために必要です。Drools による Seam セキュリティは使用しませんが含める必要があります。Drools は 6 つの jar からなります。
drools-core.jar drools-compiler.jar janino.jar mvel141.jar core.jar antlr-runtime.jar Drools 連携はこのサンプルでは使用されません。
必要な変更点はほんのわずかです。
web.xml
web.xml にすべての EJB を宣言する必要があります。 これは多くの JEE5 アプリケーションサーバー - 例えば OC4J と GlassFish - で必要となる思慮のない要求です。
以下の例は、すでに変更を完了したサンプルの web.xml ファイルです。
<ejb-local-ref>
<ejb-ref-name>
jboss-seam-jee5/AuthenticatorAction/local
</ejb-ref-name>
<ejb-ref-type
>Session</ejb-ref-type>
<local>
org.jboss.seam.example.booking.Authenticator
</local>
<ejb-link
>AuthenticatorAction</ejb-link>
</ejb-local-ref>
persistence.xml
JPA 実装の正しい構成を設定する必要があります。Hibernate を使用します。OC4J は古い ANTLR を同梱しているために別のクエリーファクトリを使用する必要があります。OC4J トランザクションマネージャも使用します。
サンプルのために resources/META-INF/persistence.xml ファイルを修正してください。Glassfish プロパティをコメントアウトし OC4J プロパティのコメントアウトをはずしてください。
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.query.factory_class"
value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.OrionTransactionManagerLookup"/>
サンプルの build.xml ファイルを修正してください。
OC4J 用とラベル付けされたライブラリプロパティのコメントアウトをはずしてください。これにより上記で説明した追加のライブラリが含まれます。
以下のようになります。
<!-- add libs for oc4j (eager classloading) -->
<property name="jbpm.lib" value="true"/>
<property name="drools.lib" value="true"/>
<property name="quartz.lib" value="true" />
<property name="search.lib" value="true" />
<property name="dbunit.lib" value="true" />
<property name="jboss-embedded-api.lib" value="true" />
examples/jee5/booking ディレクトリでant を実行してデモアプリケーションをビルドします。ビルドされるターゲットは dist/jboss-seam-jee5.ear です。
以下の手順に従って dist/jboss-seam-jee5.ear をコピーしてください。
このミニチュートリアルでは、JEE 5 アプリケーションを OC4J にデプロイするのに必要な (とても退屈な) 手順を説明します。項36.1. 「OC4J のインストールと操作」 の手順に従ってすでに OC4J をダウンロードしインストールを終えているものとして進めます。 組み込み hsqldb データベースを使用して jee5/booking サンプルをデプロイすることします。別のアプリケーションをデプロイするために、データソースとアプリケーション名を変更する必要があります。
OC4J 共用ライブラリディレクトリへ hsqldb.jar をコピーしてください。 cp $SEAM_HOME/lib/hsqldb.jar $ORACLE_HOME/j2ee/home/applib/ (OC4J には組み込みデータベースが同梱されていないので HSQLDB を使用することにします)
OC4J データソースファイル $ORACLE_HOME/j2ee/home/config/data-sources.xml を編集して、<data-sources> の内側に以下を追加してください
<managed-data-source
connection-pool-name="jee5-connection-pool"
jndi-name="jdbc/__default"
name="jee5-managed-data-source" />
<connection-pool name="jee5-connection-pool">
<connection-factory
factory-class="org.hsqldb.jdbcDriver"
user="sa"
password=""
url="jdbc:hsqldb:." />
</connection-pool>
jndi-name は persistence.xml で jta-data-source として使用されます。
$ORACLE_HOME/j2ee/home/config/server.xml を編集して、<application-server> の内側に以下を追加してください
<application name="jboss-seam-jee5"
path="../../home/applications/jboss-seam-jee5.ear"
parent="default"
start="true" />
簡単にするために、プロジェクトに使用したのと同じ名前を使用してください。
$ORACLE_HOME/j2ee/home/config/default-web-site.xml を編集して、<web-site> の内側に以下を追加してください
<web-app application="jboss-seam-jee5"
name="jboss-seam-jee5"
load-on-startup="true"
root="/seam-jee5" />
root は、アプリケーションにアクセスするために Web ブラウザに入力するコンテキストパスです。
アプリケーションを OC4J にコピーしてください。 cp dist/jboss-seam-jee5.ear $ORACLE_HOME/j2ee/home/applications/
上記の 項36.1. 「OC4J のインストールと操作」 の手順に従って、OC4J を起動 / 終了してください。
http://localhost:8888/seam-jee5 をブラウズしてアプリケーションを確認してください。
seam-genは、開発者が素早く完全な Seam アプリケーションを準備し動作させることができる優れたツールです。しかし生成されるプロジェクトは、JBoss AS 上で動作させるように構成されています。そのため OC4J で実行させるためには、追加の手順が必要になります。以下の説明は、コマンドラインとシンプルなテキストエディタを使用していることを想定します。しかし、もちろんお気に入りの IDE を使用することもできます。seam-gen プロジェクトは Eclipse と Netbeans のサポート機能も一緒に生成されます。
seam-gen 使用した簡単なアプリケーションを作成してデプロイすることから始めます。次に、seam-gen と Hibernate Tools を使用して、データベーススキーマからのリバースエンジニアリングにより基礎的な CRUD アプリケーションを生成するのがいかに簡単であるかを示します。seam-gen は、 JPA エンティティ Bean や Seam アプリケーションフレームワークコンポーネント、 JSF ビューを作成します。Drools を使用した Seam セキュリティも追加します。
このチュートリアルは MySQL を使用します (しかしもちろん SQL とデータソースを適切に変更して、どんなデータベースも使用できます); MySQL をインストールし構成して実行して、サンプルデータを持つデータベースを作成してください。JDBC サポートのために mysql-connector-java-X.jar もダウンロードするのを忘れないでください。このチュートリアルで Seam セキュリティを設定するには、username と password カラムを持つ User という名前のテーブルと最低一つのエントリがあることを想定します。さらに好きなどんなタイプのサンプルデータとテーブルを設定することもできます。
まず seam-gen をセットアップする必要があります。Seam ディストリビューションディレクトリで ./seam setup を実行します。以下の設定例に従い、あなたのシステムと設定に基づいて設定してください (例えば oc4jexample の代わりに自分のデータベース名を使用してください)。
> ./seam setup
Buildfile: build.xml
init:
setup:
[echo] Welcome to seam-gen :-)
[input] Enter your Java project workspace (the directory that contains your
Seam projects) [C:/Projects] [C:/Projects]
/home/jbalunas/workspace
[input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA]
[C:/Program Files/jboss-4.2.3.GA]
/home/jbalunas/jboss/jboss-4.2.3.GA
[input] Enter the project name [myproject] [myproject]
oc4j_example
[echo] Accepted project name as: oc4j_example
[input] Select a RichFaces skin (not applicable if using ICEFaces) [blueSky]
([blueSky], classic, ruby, wine, deepMarine, emeraldTown, sakura, DEFAULT)
[input] Is this project deployed as an EAR (with EJB components) or a WAR
(with no EJB support) [ear] ([ear], war, )
[input] Enter the Java package name for your session beans [com.mydomain.
oc4j_example] [com.mydomain.oc4j_example]
org.jboss.seam.tutorial.oc4j.action
[input] Enter the Java package name for your entity beans [org.jboss.seam.
tutorial.oc4j.action] [org.jboss.seam.tutorial.oc4j.action]
org.jboss.seam.tutorial.oc4j.model
[input] Enter the Java package name for your test cases [org.jboss.seam.
tutorial.oc4j.action.test] [org.jboss.seam.tutorial.oc4j.action.test]
org.jboss.seam.tutorial.oc4j.test
[input] What kind of database are you using? [hsql] ([hsql], mysql, oracle,
postgres, mssql, db2, sybase, enterprisedb, h2)
mysql
[input] Enter the Hibernate dialect for your database [org.hibernate.
dialect.MySQLDialect] [org.hibernate.dialect.MySQLDialect]
[input] Enter the filesystem path to the JDBC driver jar [/tmp/seam/lib/hsqldb.jar]
[/tmp/seam/lib/hsqldb.jar]
lib/mysql-connector.jar
[input] Enter JDBC driver class for your database [com.mysql.jdbc.Driver]
[com.mysql.jdbc.Driver]
[input] Enter the JDBC URL for your database [jdbc:mysql:///test]
[jdbc:mysql:///test]
jdbc:mysql:///oc4jexample
[input] Enter database username [sa] [sa]
username
[input] Enter database password [] []
password
[input] skipping input as property hibernate.default_schema.new has already
been set.
[input] Enter the database catalog name (it is OK to leave this blank) [] []
[input] Are you working with tables that already exist in the database? [n]
(y, [n], )
y
[input] Do you want to drop and recreate the database tables and data in
import.sql each time you deploy? [n] (y, [n], )
n
[input] Enter your ICEfaces home directory (leave blank to omit ICEfaces) [] []
[propertyfile] Creating new property file:
/home/jbalunas/workspace/jboss-seam/seam-gen/build.properties
[echo] Installing JDBC driver jar to JBoss server
[copy] Copying 1 file to /home/jbalunas/jboss/jboss-4.2.3.GA/server/default/lib
[echo] Type 'seam create-project' to create the new project
BUILD SUCCESSFULプロジェクトを作成するためには、$ ./seam new-project と入力してください。そして cd /home/jbalunas/workspace/oc4j_example と入力して新しく作成されたディレクトリへ移動してください。
生成されたプロジェクトに変更を行う必要があります。
構成ファイルの変更から始めましょう:
build.xml
デフォルトのターゲットを archive に変更します (OC4J への自動的なデプロイを行いません)。
<project name="oc4j_example" default="archive" basedir=".">
OC4J は、ear ファイルのルートではなく war ファイルのルートで drools の /security.drl ファイルを探すので、ビルド時には正しい場所へ移動させるように build.xml に設定する必要があります。以下の変更は、 <target name="war" depends="compile" description="Build the distribution .war file"> ターゲットの先頭に追加しなければなりません。
<copy todir="${war.dir}">
<fileset dir="${basedir}/resources" >
<include name="*.drl" />
</fileset>
</copy>
resources/META-INF/persistence-dev.xml
jta-data-source を jdbc/__oc4jexample に修正してください (後述のデプロイ時に data-sources.xml にデータソースを作成する場合は、jndi-name としてこれを指定してください)。
プロパティを追加してください (jee5/booking サンプルで述べられています)。
<property name="hibernate.query.factory_class"
value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory" />
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.OrionTransactionManagerLookup" />
<property name="hibernate.transaction.flush_before_completion"
value="true"/>
<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.HashtableCacheProvider"/>
EntityManagerFactory を定義する JBoss AS 固有のメソッドを取り除いてください。
<property
name="jboss.entity.manager.factory.jndi.name"
value="java:/oc4j_exampleEntityManagerFactory">
prod プロファイルを使用して OC4J にデプロイしたければ、persistence-prod.xml も同様に修正する必要があります。
resources/META-INF/jboss-app.xml
JBoss AS にはデプロイしないのでこのファイルを削除できます (JBoss AS では jboss-app.xml を使用して、クラスローディングの分離を有効にします)
resources/*-ds.xml
JBoss AS にはデプロイしないのでこのファイルを削除できます (これらのファイルは、JBoss AS ではデータソースを定義していますが、OC4J ではマスタの data-sources.xml ファイルを編集しなければなりません)
resources/WEB-INF/components.xml
コンテナ管理トランザクションの統合を有効にします - <transaction:ejb-transaction /> コンポーネントと、その名前空間宣言 xmlns:transaction="http://jboss.com/products/seam/transaction" を追記してください
jndi-pattern を java:comp/env/oc4j_example/#{ejbName}/local に修正します
アプリケーションで Seam 管理永続コンテキストを使用できるようにします。残念なことに OC4J は JNDI に EntityManagerFactory を登録しませんが、Seam が組み込みのマネージャコンポーネントを提供しています。このコンポーネントを有効にするために、以下のエントリを追加します。
<persistence:entity-manager-factory
auto-create="true"
name="oc4jEntityManagerFactory"
persistence-unit-name="oc4j_example" />
Seam に組み込みのマネージャコンポーネントを使用するように設定する必要があるので、managed-persistence-context を修正して、存在する要素へ EntityManagerFactory を挿入します。
<persistence:managed-persistence-context
name="entityManager"
auto-create="true"
entity-manager-factory="#{oc4jEntityManagerFactory}" />
resources/WEB-INF/web.xml
以下の Seam コンテナ管理トランザクション統合 EJB のエントリを追加しなければなりません。 OC4J では、アプリケーションをさらに修正すれば、EJB をここで宣言する必要があることを思い出してください。
<ejb-local-ref>
<ejb-ref-name>
oc4j_example/EjbSynchronizations/local
</ejb-ref-name>
<ejb-ref-type
>Session</ejb-ref-type>
<local>
org.jboss.seam.transaction.LocalEjbSynchronizations
</local>
<ejb-link
>EjbSynchronizations</ejb-link>
</ejb-local-ref>
resources/META-INF/orion-application.xml
これは、OC4J で RichFaces と Ajax4Jsf スタイルシートを稼動させるために作成しなければないないファイルです。このファイルは、基本的に OC4J がそれ自身の受け継がれた URL 設定で動作しないように設定します。
<?xml version = '1.0' encoding = 'utf-8'?>
<orion-application
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/
orion-application-10_0.xsd"
schema-major-version="10"
schema-minor-version="0"
component-classification="internal">
<imported-shared-libraries>
<remove-inherited name="oracle.xml"/>
</imported-shared-libraries>
</orion-application>
ear アーカイブにこのファイルをコピーするように、build.xml ファイルを設定する必要があります。 <target name="ear" description="Build the EAR"> ターゲットを見つけて、 <copy todir="${ear.dir}/META-INF"> セクションを以下のように修正してくだい
<copy todir="${ear.dir}/META-INF">
<fileset dir="${basedir}/resources/META-INF">
<include name="application.xml" />
<include name="orion-application.xml"/>
<include name="jboss-app.xml" />
</fileset>
</copy>
このアプリケーションは、jee5/booking サンプルと同様の変更が必要となります。
build.xml は、生成するアーカイブファイルに以下にリストした jar を追加するように修正しなければなりません。以下の <fileset dir="${basedir}"> セクションを探して、 その下にインポートされる他のライブラリを追加してください。
<target name="ear" description="Build the EAR">
<copy todir="${ear.dir}">
<fileset dir="${basedir}/resources">
<include name="*jpdl.xml" />
<include name="*hibernate.cfg.xml" />
<include name="jbpm.cfg.xml" />
<include name="*.drl" />
</fileset>
<fileset dir="${lib.dir}">
<include name="jboss-seam.jar" />
</fileset>
<fileset dir="${basedir}">
<include name="lib/jbpm*.jar" />
<include name="lib/jboss-el.jar" />
<include name="lib/drools-*.jar"/>
<include name="lib/janino*.jar"/>
<include name="lib/antlr-*.jar"/>
<include name="lib/mvel*.jar"/>
<include name="lib/richfaces-api*.jar" />
</fileset>
</copy>
<copy todir="${ear.dir}/META-INF">
<fileset dir="${basedir}/resources/META-INF">
<include name="application.xml" />
<include name="jboss-app.xml" />
</fileset>
</copy>
</target>
Hibernate 依存関係
<include name="lib/hibernate.jar"/>
<include name="lib/hibernate-annotations.jar"/>
<include name="lib/hibernate-commons-annotations.jar"/>
<include name="lib/hibernate-entitymanager.jar"/>
<include name="lib/hibernate-search.jar"/>
<include name="lib/hibernate-validator.jar"/>
<include name="lib/commons-logging.jar"/>
<include name="lib/commons-collections.jar"/>
<include name="lib/jboss-common-core.jar"/>
Drools — Seam セキュリティルールのために Drools を使用するので、Eclipse JDT コンパイラに追加する必要があります (これは JBoss AS では必要ありません; これは OC4J のクラスローディングの問題のためです)。
<include name="lib/core.jar"/>
サードパーティ jar — これらの多くは OC4J クラスローディングのためのみに必要です。
<include name="lib/javassist.jar"/>
<include name="lib/quartz.jar"/>
<include name="lib/dbunit.jar"/>
<include name="lib/jboss-embedded-api.jar"/>
<include name="lib/dom4j.jar"/>
<include name="lib/lucene-core.jar"/>
<include name="lib/cglib.jar"/>
<include name="lib/asm.jar"/>
<include name="lib/commons-beanutils.jar"/>
<include name="lib/commons-digester.jar"/>
<include name="lib/concurrent.jar"/>
<include name="lib/antlr.jar"/>
最後には以下のようになります。
<fileset dir="${basedir}">
<include name="lib/jbpm*.jar" />
<include name="lib/jboss-el.jar" />
<include name="lib/drools-*.jar"/>
<include name="lib/janino*.jar"/>
<include name="lib/antlr-*.jar"/>
<include name="lib/mvel*.jar"/>
<include name="lib/richfaces-api*.jar" />
<include name="lib/hibernate.jar"/>
<include name="lib/hibernate-annotations.jar"/>
<include name="lib/hibernate-commons-annotations.jar"/>
<include name="lib/hibernate-entitymanager.jar"/>
<include name="lib/hibernate-search.jar"/>
<include name="lib/hibernate-validator.jar"/>
<include name="lib/commons-logging.jar"/>
<include name="lib/commons-collections.jar"/>
<include name="lib/jboss-common-core.jar"/>
<include name="lib/core.jar"/>
<include name="lib/javassist.jar"/>
<include name="lib/quartz.jar"/>
<include name="lib/dbunit.jar"/>
<include name="lib/jboss-embedded-api.jar"/>
<include name="lib/dom4j.jar"/>
<include name="lib/lucene-core.jar"/>
<include name="lib/cglib.jar"/>
<include name="lib/asm.jar"/>
<include name="lib/commons-beanutils.jar"/>
<include name="lib/commons-digester.jar"/>
<include name="lib/concurrent.jar"/>
<include name="lib/antlr.jar"/>
</fileset>
これらの手順は 項36.3. 「OC4J への Seam アプリケーションのデプロイ」 の手順と非常に類似していますが、oc4j_example アプリケーションへ正しく置き換えて使用することが必要です。
プロジェクトのベースディレクトリ (例えば /home/jbalunas/workspace/oc4j_example) で ant を実行してアプリケーションをビルドしてください。ビルドされるターゲットファイルは dist/oc4j_example.ear です。
mysql-connector.jar ファイルを $ORACLE_HOME/j2ee/home/applib ディレクトリにコピーして、JDBC ドライバが利用できるようにしてください。
$ORACLE_HOME/j2ee/home/config/data-sources.xml
<managed-data-source
connection-pool-name="oc4j-example-connection-pool"
jndi-name="jdbc/__oc4jexample"
name="oc4j-example-managed-data-source" />
<connection-pool
name="oc4j-example-connection-pool">
<connection-factory
factory-class="com.mysql.jdbc.Driver"
user="username"
password="password"
url="jdbc:mysql:///oc4j" />
</connection-pool>
$ORACLE_HOME/j2ee/home/config/server.xml
<application name="oc4j_example"
path="../../home/applications/oc4j_example.ear"
parent="default"
start="true" />
$ORACLE_HOME/j2ee/home/config/default-web-site.xml
<web-app application="oc4j_example"
name="oc4j_example"
load-on-startup="true"
root="/oc4j_example" />
上記の 項36.1. 「OC4J のインストールと操作」 の手順に従って、OC4J を起動 / 終了してください。
http://localhost:8888/oc4j_example をブラウズしてアプリケーションを確認してください。
ここでは、基本的な seam-gen アプリケーションを、現存のデータベースをもとにした本格的な CRUD アプリケーションに拡張します。さらに Drools ベースのセキュリティも追加します。
Seam ディストリビューションのベースディレクトリで ./seam generate-entities と入力してください。これにより、エンティティや Seam アプリケーションフレームワーククラス、CRUD アプリケーションの関連するビューが作成されます。
これで完成...本当に...これで完成です。 前のようにビルドしてデプロイして、自分で確かめてみてください。
上記で述べたように、ここでは username と password のカラムを持つ User テーブルと、少なくとも一つのエントリを持つデータベースがあることを想定しています。もしデータベースがなければ、以下の authenticate メソッドを修正する必要があります。
authenticator クラスをステートレスセッション Bean にすることによって、User エンティティを Seam セキュリティにリンクします (OC4J は要するに EJB3 コンテナです!)。
@Stateless アノテーションを Authenticator クラスに付与します。
クラス名を AuthenticatorAction に変更します。
AuthenticatorAction が実装する Authenticator という名前のインタフェースを作成してください (EJB3 ではセッション Bean にローカルインタフェースが必要)。インタフェースに @Local アノテーションを付与し、AuthenticatorAction の authenticate と同じシグニチャのメソッドを一つ追加してください。
@Name("authenticator")
@Stateless
public class AuthenticatorAction implements Authenticator {
@Local
public interface Authenticator {
public boolean authenticate();
}
AuthenticatorAction クラスに以下の行を追加することによって EntityManager をインジェクトするのに@PersistenceContext を使用してください。
@PersistenceContext private EntityManager entityManager;
authenticate クラスを実装してください。
public boolean authenticate() {
List <User
> users = entityManager .createQuery("select u from User u where
u.username = #{identity.username} and
u.password = #{identity.password}") .getResultList();
if (users.size() == 1) {
identity.addRole("admin");
return true;
} else {
return false;
}
}
web.xml に EJB3 参照を追加してください。
<ejb-local-ref>
<ejb-ref-name>
oc4j_example/AuthenticatorAction/local
</ejb-ref-name>
<ejb-ref-type
>Session</ejb-ref-type>
<local>
org.jboss.seam.tutorial.oc4j.action.Authenticator
</local>
<ejb-link
>AuthenticatorAction</ejb-link>
</ejb-local-ref>
前のようにビルドしてデプロイしてください、今は単に実際に入力されたユーザー名とパスワードが受け入れられることに注意してください。