JavaEE 6 をテキストエディタだけで(2) -EJB編

blog1.mammb.com

前回に続いて EJB 呼び出し。

EJB の依存関係を pom に追加

javax.ejb の依存を pom.xml に追加

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.ejb</artifactId>
    <version>3.1</version>
    <scope>provided</scope>
</dependency>


全文は以下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>etc9</groupId>
    <artifactId>webapp001</artifactId>
    <version>0.1</version>
    <packaging>war</packaging>

    <name>webapp001</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.ejb</artifactId>
            <version>3.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project>

EJBの作成

今やEJBは単なるPOJO。src/main/java/etc9/service に HelloEjb.java を作成

package etc9.service;

import javax.ejb.Stateless;

@Stateless
public class HelloEjb {

    public String greet(String str) {
        return "Hello, " + str + "!!";
    }
}
  • @Statelessにてステートレスセッションビーンを指定
  • アノテーションによりコンテナがEJBとして扱う
  • EJB3.1 では EJB に(LoaclまたはRemote)インターフェースを付けなくても良い

サーブレットへの DI

前回作成分のサーブレットsrc/main/java/etc9/SampleServlet.java に @EJB にて EJB を DI

import javax.ejb.EJB;
// ・・・

@WebServlet(urlPatterns={"/servlet/SampleServlet"})
public class SampleServlet extends HttpServlet {
    
    @EJB
    private HelloEjb hello;
    
    public void doGet(HttpServletRequest req,
            HttpServletResponse res) throws IOException {  
        PrintWriter pw = res.getWriter();  
        pw.println("This is Servlet3.0 with EJB");
        pw.println(hello.greet("EJB"));
    }
}

パッケージとデプロイ

前回と同様

mvn package
asadmin deploy target/webapp001-0.1.war
  • EJB3.1 では EJB でも war ファイルとしてデプロイ可能

http://localhost:8080/webapp001-0.1/servlet/SampleServlet にアクセスすると以下が表示される

これだけー


ローカル・リモートインターフェース

やけに簡単なので、ローカル・リモートインターフェースについても少しふれておく


ローカルインターフェースを作成

package etc9.service;

import javax.ejb.Local;

@Local
public interface HelloEjbLocal {
    String greetLocal(String str);
}


リモートインターフェースの場合は以下

package etc9.service;

import javax.ejb.Remote;

@Remote
public interface HelloEjbRemote {
    String greetRemote(String str);
}


HelloEjb に implements

@Stateless
public class HelloEjb implements HelloEjbLocal, HelloEjbRemote {
    // ・・・
}

これにて、greetLocal() はローカル呼び出し、greetRemote() はリモート呼び出しになる


HelloEjbLocal と HelloEjbRemote につけたアノテーションを外して、

@Stateless
@Remote(HelloEjbRemote.class)
@Local(HelloEjbLocal.class)
public class HelloEjb implements HelloEjbLocal, HelloEjbRemote {
    // ・・・
}

のように EJB の実装側でローカルとリモートを決定することもできる

この場合、クライアント側では

@EJB
private HelloEjbRemote helloRemote;

@EJB
private HelloEjbLocal helloLocal;

のようになる。

インターフェースとして定義していない HelloEjb のメソッドを使いたい場合は、

@Stateless
@Remote(HelloEjbRemote.class)
@Local(HelloEjbLocal.class)
@LocalBean
public class HelloEjb implements HelloEjbLocal, HelloEjbRemote {
    // ・・・
}

として、呼び出し側では

@EJB
private HelloEjb hello;

のように定義しておく。


次回は 今回作成したEJB に JPA を組み込む
blog1.mammb.com