初めてのJava EE 6 (EJB3.1)

前回はセットアップからServlet作成まで試してみました。Java EE 6ではServletは3.0となり、web.xmlに書かなくてもServletとして定義できるようになりました。ただ、Servletを書くなんて事は今やほとんどないかもしれません。Javaに限らず、Webアプリは何かしらフレームワークを使うのが一般的ですし。

今回は、EJB3.1を試してみます。こちらはバージョン番号的にはマイナーバージョンアップですが、個人的にはServlet3.0よりうれしい機能拡張だと思います。3.1では以下のような機能が追加されている模様。

  • ローカルインターフェースの省略が可能
  • WARにパッケージング可能
  • Singleton EJB
  • タイマーサービスの強化
  • 非同期実行

ServletからStateless Session Beanを呼び出してみる

では前回作成した動的Webプロジェクトに、EJB(Stateless Session Bean)を追加してみます。3.1ではWARにパッケージすることができるようになったので、WARである動的Webプロジェクトに追加できるようになっています。

  • プロジェクトを選択し、右クリック-[New]-[Session Bean (Java EE 6)]を選択します。

f:id:Hirohiro:20091227210114p:image

  • ウィザードが起動しますので、作成するEJBの情報を入力します。今回はパッケージ名とクラス名のみ入力し、後はデフォルトのまま[Finish]をクリックします。
    • Java package: org.example
    • Class name: HelloService

f:id:Hirohiro:20091227210115p:image

  • HelloService.javaのひな形が作成されるので、ビジネスメソッドを追加します。ここでは下記のようにsayHelloメソッドを追加しました。
package org.example;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

/**
 * Session Bean implementation class HelloService
 */
@LocalBean
@Stateless
public class HelloService {

    /**
     * Default constructor. 
     */
    public HelloService() {
        // TODO Auto-generated constructor stub
    }
    
    public void sayHello() {
    	System.out.println("Hello!!");
    }

}
  • EJBの作成はこれで終わりです。これで保存すると、GlassFishを起動しっぱなしの場合はホットデプロイが即行われ、EJBがデプロイされたことを確認できます。

情報: Portable JNDI names for EJB HelloService : [java:global/helloworld/HelloService!org.example.HelloService, java:global/helloworld/HelloService]
情報: Loading application helloworld at /helloworld
情報: Loading application helloworld at /helloworld
情報: Loading application helloworld at /helloworld
情報: helloworld was successfully deployed in 320 milliseconds.

  • 続いて、ServletからEJBを呼び出すコードを追加します。HelloServlet.javaに、以下のように記述を追加して保存します。
@WebServlet(name = "HelloWorld", urlPatterns = { "/HelloWorld" })
public class HelloWorld extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	//追加
	@EJB
	HelloService helloService;

(省略)

	/**
	 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
	 * @param request servlet request
	 * @param response servlet response
	 * @throws ServletException if a servlet-specific error occurs
	 * @throws IOException if an I/O error occurs
	 */
	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//追加
		helloService.sayHello();
  • ブラウザからアクセスします。前回と同様に、http://localhost:8084/helloworld/HelloWorld にアクセスすると、コンソールに下記のように出力され、EJBがちゃんと動作していることを確認できます。

情報: Hello!!

EJBは3.0で大幅に改善はされたのですが、個人的にはEJB-JARを作らないといけない、常にインタフェースが必要というのはいまいちでした。EJB 3.1では、WARだけでシンプルにアプリが作れるようになったのはかなり良いと思います。EJB2.x時代からEJBを触ってた身としては、これ本当にEJB?というくらいライトな感じ。インタフェースもいらないし。

ちなみにですが、今回ウィザードで作成したEJBのクラスには@LocalBeanと付いていましたが、これを消してみても呼び出すことができました。てっきり、このアノテーションがある場合はインタフェースなしでもEJBとなる印なのかなと思ったのですが。