CDIステップ5 CDIイベント


実はCDIの事件はかなり簡単です.注釈は1つで十分です.
知識ポイントは2つしかありません.
1@Observes注記
2 Eventインタフェース
正しい方法は観察者クラスを書くことであり,観察者クラスの観察方法パラメータに@Observes注釈を加えればよい.
まずCDI管理のBEANを書きます.
package com.rschy.cdievent;
 
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
 
@RequestScoped
public class HelloBean {
 
@Inject
private Event<Object> event;
public String greeting(){
  String s = "Hello, world!";
  event.fire(s);
  return s;
}
}

このコードにはイベントオブジェクトが注入されています.ビジネス・メソッドでイベント・オブジェクトのバインド・メソッドが呼び出されます.そしてCDIコンテキストは観察者を探しに行きます.
観察者類を書きます
package com.rschy.cdievent;
 
import java.time.LocalDateTime;
 
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Observes;
 
@RequestScoped
public class HelloHandler {
 
  public void log(@Observes String s) {
    System.out.println(LocalDateTime.now() +":"+ s);
  }
}

ここで観察するメソッドパラメータはStringであり,ビジネスメソッドの汎用型はObjectであるが,正常に使用できることに注意する.
サーブレットコードはかなり簡単です
package com.rschy.cdievent;

import java.io.IOException;

import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello.html")
public class HelloServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Inject
	private HelloBean bean;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().append(bean.greeting());
	}

}

その後実行すると、ブラウザの図は貼られません.glassfishコンソールの印刷結果は以下の通りです.
2016-01-11 T 16:50:27.544+0800|情報:2016-01-11 T 16:50:27.544:Hello,world!
CDI事件は簡単だ.