2009年11月12日木曜日

JSF 2.0/JCR 2.0/JSR-250/JNDI

JSF 2.0 と JCR 2.0(Jackrabbit)を併用してみる。 JDBC の DataSource に JNDI 経由でアクセスするのと同じやり方で、JCR の Repository を扱いたい。ただし ManagedBean が Repository にアクセスするときには、JNDI は使わずに、標準アノテーション(JSR-250)によりインジェクトされたリソースとして扱いたい。 ■ 前提
  • プロジェクトディレクトリ直下に、既に Jackrabbit の repository.xml と repository フォルダがある。
  • このリポジトリの /hello/world@message に、文字列"Hello, World!"が格納されている。(前ポスト参照)
■ プロジェクトを作る
  • 適当に Dynamic Web Project を作って Maven 管理にする(例えばこんなやり方)。(Maven プロジェクトを作って Dynamic Web Project ファセットを与えるやり方でも可。)プロジェクト名はここでは "jcr-tomcat" とした。
  • pom.xml の dependency に 以下を指定。
    groupIdartifactIdversion
    javax.jcrjcr2.0
    org.apache.jackrabbitjackrabbit-core2.0-beta1
    org.slf4jslf4j-log4j121.5.5
    com.sun.facesjsf-api2.0.2-b02
    com.sun.facesjsf-impl2.0.2-b02
  • META-INF 下に、Tomcat の context.xmlを書く
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
       <Resource name="jcr/repository" auth="Container" type="javax.jcr.Repository"
          factory="org.apache.jackrabbit.core.jndi.BindableRepositoryFactory"
          configFilePath="C:/devel/ws/java/eclipse/standards1/jcr-tomcat/repository.xml" 
          repHomeDir="C:/devel/ws/java/eclipse/standards1/jcr-tomcat/repository" />
    </Context>
  • お決まりのファイルを用意する。
    • log4j.propertiesを適当に書く
    • web.xml に faces 関連のサーブレット定義を追加。
■ コードを書く 以下のような ManagedBean を書いてみる。
package mypackage;

import 略

@ManagedBean
public class JcrBean {
   private static final String USERNAME = "username";
   private static final char[] PASSWORD = "password".toCharArray();

   @Resource(name="jcr/repository", type=Repository.class)
   private Repository repository;
   
   public String getGreet() {
      Session session = null;
      try {
         session = repository.login(
                   new SimpleCredentials(USERNAME, PASSWORD));
         Node node = session.getNode("/hello/world");
         return node.getProperty("message").getString();
      } catch (RepositoryException e) {
         return e.getMessage();
      } finally {
         if (null != session) session.logout();
      }
   }
}
この管理 bean を使う jcrtext.xhtml を書く。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html">
   <h:body>#{jcrBean.greet}</h:body>
</html>
■ 確認
  • ブラウザでhttp://localhost:8080/jcr-tomcat/jcrtest.faces を見てみる
  • "Hello, World!"が表示されたら JSF から Jackrabbit まで疎通OK
■ 後記
  • ここでやった JNDI のセッティングは、アプリ毎に別々のリポジトリを使うやり方だけど、共有するとか、他にも構成のパターンがある。(参考URL
  • 試行錯誤しながらやってると、いろんなタイミングでしょっちゅう.lock ファイルが残って面倒くさい。本番で使うときは、なんか考えておいた方がいいかも。

0 件のコメント:

コメントを投稿