2009年12月26日土曜日

WASCE/WTP/Java EE 5

前回、WASCE を Eclipse+WTP から動かしてみた。今度は、この環境で Java EE 5 の簡単な疎通確認をやろうと思う。 確認したいのは ブラウザ→ Servlet→ SessionBean→ JPA→ MySQL という連携だけど、まずは Servlet まで通し、続いて SessionBean、最後に JPA+MySQL という段取りで、疎通してみる。 ■ Servlet まで疎通 ◆ hello-ear プロジェクト作成 適当に新規 Enterprise Application Project を作る。以下、入力例。
target runtimeIBM WASCE v2.1
EAR version5.0
ConfigurationDefault Configuration ・・・
Group Idnet.yasuabe.studies.wasce
Artifact Idhello-ear
Artifact Typeear
◆ hello-war プロジェクト作成適当に新規 Dynamic Web Project を作る。以下、入力例。
target runtimeIBM WASCE v2.1
Dynamic Web Module version2.5
ConfigurationDefault Configuration ・・・
Add project to EARcheck
EAR project namehello-ear
Group Idnet.yasuabe.studies.wasce
Artifact Idhello-ear
Artifact Typewar
◆ hello-ear に プロジェクト依存を追加 プロジェクトの Properties を開いて、"Java EE Module Dependencies" で hello-war にチェック ◆hello-war HTTP/GET を受け取って、文字列 "Hello, Servlet!" を返すサーブレットを作る。
  • [New]/[Other...]/[Servlet] を実行し、net.yasuabe.studies.wasce.war.HelloServlet.java を作成。
  • 以下のようにコードを書き換える
    public class HelloServlet extends HttpServlet {
       private static final long serialVersionUID = 1L;
       protected void doGet(
                HttpServletRequest request, 
                HttpServletResponse response) throws ServletException, IOException {
          response.getWriter().write("Hello, Servlet!");
       }
    }
◆ 確認 ・Servers ビューで hello-ear を WASCE に追加して、起動。 ・http://localhost:8080/hello-war/HelloServlet をブラウザで開くと、Hello, Servlet!と表示されるはず。 以上、ブラウザ→ Servlet まで。 ■ SessionBean まで疎通 続いて、文字列 "Hello, SessionBean!" を返すメソッド sayHello() を持つ SessionBean を書く。 ◆ hello-ejb 作成 適当に新規 EJB Project を作成。以下、入力例。
target runtimeIBM WASCE v2.1
EJB Module version3.0
ConfigurationDefault Configuration ・・・
Add project to EARcheck
EAR project namehello-ear
Group Idnet.yasuabe.studies.wasce
Artifact Idhello-ejb
Artifact Typeejb
◆ hello-ear に プロジェクト依存を追加 プロジェクトの Properties を開いて、"Java EE Module Dependencies" で hello-ejb にチェック ◆ HelloService EJB 作成 hello-ejb プロジェクトで [New]/[Session Bean (EJB 3.x)] を実行。以下入力例。
パッケージ名net.yasuabe.studies.wasce.ejb
クラス名HelloService
コードは以下のような感じ。
@Local
public interface HelloServiceLocal {
   String sayHello();
}

@Stateless
public class HelloService implements HelloServiceLocal {
   @Override public String sayHello() {
      return "Hello, SessionBean!";
   }
}
◆ hello-war での呼び出しコード記述
  • プロジェクトプロパティの"Java EE Module Dependencies"で hello-ejb にチェック
  • doGet()定義の上あたりに、新規フィールドを追加
    @EJB HelloServiceLocal helloService;
  • doGet の中身を以下のように書き換える
    response.getWriter().write(helloService.sayHello());
◆ 確認 再び、http://localhost:8080/hello-war/HelloServlet を開いて、今度は「Hello, SessionBean!」と表示されるのを確認する。 これで EJB3 に届いた。 ■ JPA+MySQL まで疎通 JPA による データベース・アクセスを以下の流れでやってみる。
  • まずテーブルを用意
  • データソースの設定
  • JPA によるアクセスコード
◆ テーブルの準備
mysql> use test;
mysql> CREATE TABLE t1 (c1 int primary key, c2 varchar(20));
mysql> insert into t1(c1, c2) values(1, 'Hello, JPA!');
mysql> select * from t1;
+----+-------------+
| c1 | c2          |
+----+-------------+
|  1 | Hello, JPA! |
+----+-------------+
◆ データソースの準備
  • WASCE が ドライバの jar を使えるように、"Services"/Repository から mysql-connector を登録する。内部的には以下のようにファイルが置かれる。
    {WASCE_HOME}/repository
      └ mysql
        └ mysql-connector-java
          └ 5.1.10
            └ mysql-connector-java-5.1.10.jar
  • WASCE 管理画面で、Database Pools >Using the Geronimo database pool wizardの順に選択し、以下のように入力
    Name of Database Pooljdbc/HelloDS
    Database TypeMySQL
    Database Nametest
◆ HelloEntity 作成 以下、hello-ejb プロジェクトでの作業。 まず、hello-ejb プロジェクトに以下のようなクラスを書く
package net.yasuabe.studies.wasce.entity;
@Entity(name="t1")
public class HelloEntity {
   @Id @Column(name="c1") private int id;
   @Column(name="c2") private String message;
   ...getter/setter 略
}
次に、META-INF 下にpersistence.xml を作り、以下のように記述する。
<?xml version="1.0" encoding="UTF-8"?>
<persistence    xmlns="http://java.sun.com/xml/ns/persistence"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"
                xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="HelloUnit" transaction-type="JTA">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <jta-data-source>jdbc/HelloDS</jta-data-source>
    </persistence-unit>
</persistence>
◆ geronimo-application.xml に依存追加 hello-ear プロジェクトの geronimo-application.xml に以下のように依存を追加する。
<dep:dependencies>
   <dep:dependency>
      <dep:groupId>console.dbpool</dep:groupId>
      <dep:artifactId>jdbc_HelloDS</dep:artifactId>
      <dep:version>1.0</dep:version>
      <dep:type>rar</dep:type>
   </dep:dependency>
</dep:dependencies>
これは Geronimo Deployment Plan Editor の Deployment タブから、Server Dependencies の [Add] で追加することもできる。 この記述が無いと、「Unable to resolve reference "JtaDataSourceWrapper"」という文言のエラーが出て、気づくまでかなり悩むことになったりする。plan というものに慣れるのが、ツボらしい。 ちなみに groupId, artifactId は WASCE の管理コンソールから確認することができる。(Database Pools ページの、jdbc/HelloDS 行 Actions 列から Usage を選択) ◆ 実行 再び、http://localhost:8080/hello-war/HelloServlet を開いて、今度は「Hello, JPA!」と表示されるのを確認する。 これでプレゼンテーション層からデータ層まで疎通できた。 ==== ◆ 手間取ったところ
  • Deployment Plan というのが最初分かりにくくて、geronimo-application.xml への追記を発見するまで手間取った。
  • MySQL の場合、データソースを追加するに先立って、予め repository に データベースドライバを含む jar を置いてないと駄目らしく、気付くまでちょっと悩んだ。他のいくつかの DB は Out-of-the-box で使える。

0 件のコメント:

コメントを投稿