ログイン/認証ロジックの処理
プロジェクトウィザードはログインを作成するだけでなく、ログインをルートパッケージ内のAuthenticator.javaというビジネスオブジェクトに接続します。Authenticator.java内にログインの検証をすべてコーディングし、成功か否かに応じてtrueまたはfalseを返してください。
@Name("authenticator") ''public class'' Authenticator { @Logger Log log; @In Identity identity; ''public boolean'' authenticate() { log.info("authenticating #0", identity.getUsername()); //write your authentication logic here, //return true if the authentication was //successful, false otherwise identity.addRole("admin"); ''return true;'' } }
JPAエンティティの作成
EclipseのProject Explorer内でプロジェクトノードを右クリックし、[New]→[Seam Generate Entities]メニューオプションを選択します。これにより、新しいウィザードが起動され、プロジェクト作成時に定義した接続プロファイルを使ってJPAエンティティが自動的に生成されます(図13を参照)。さらに、各エンティティについて基本的なメンテナンスWebページも作成されるので、反復的な作業にかかる時間が大いに節約されます。
このウィザードは、この例のために作成した平凡なデータモデルでは申し分なく働くのですが、テーブルが何百もあるプロダクションデータベースで実行したところ、うまく働きませんでした。データベース内の全テーブルについて1つ1つエンティティの作成を試みているようで、どれを含めるかは指定できませんでした。しかし、エンティティクラスを前もって作成しておけば、関連するメンテナンスページの生成前にそれらを選択することができました。
幸いなことに、このような複雑なデータベーススキーマに対しては、Eclipse IDE for Java EEに付属のDali JPAツールを使用して、エンティティを作成し、それらをSeamプロジェクトにインポートすることができました。とはいえ、デフォルトのアクションやメンテナンスWebページなど、生成された追加的なコードの一部は失われました。
さらに、生成されたSeam JPAコードを手作業で操作する必要もありました。JPAエンティティ内に含まれている、疑わしい実スキーマ名を削除しなければなりませんでした。たとえば次のものを、
@Entity @Table(name = "author", catalog = "devx") ''public class'' Author ''implements'' java.io.Serializable
次のような純粋なテーブルベースの注釈に置き換えることにしました。
@Entity @Table(name = "author") ''public class'' Author ''implements'' java.io.Serializable
実際の注釈にデータベース名を含めることに関するロジックはよくわかりません。実のところ、これはJPA Entity Managerが使用するデータベース接続のプロパティなのです。したがって、それは実際のコードに属していないと思います。
このような懸念事項はありますが、それもSeamが個々のJPAエンティティについて、ナビゲーションと統合的な検証機能を備えた一連の完璧な検索/編集ページを生成してくれることを思えばどうということはありません。後はHTMLに若干の操作を行って、レイアウトを修正し、デフォルトのラベルをもっとユーザーフレンドリーなものに置き換えるだけで済みます。
もう1つ付け加えると、デフォルトのFaceletsテンプレート(WebContent/layout/template.xhtml)を修正して、生成された各ページへのデフォルトのリンクの表示方法を変更することができます(図14を参照)。