前回に続いて 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