[Subsonic Airlines] 会員登録画面 – ステートレスセッションビーン

今回は、ステートレスセッションビーンの作成について説明します。

これまでの記事

http://subsonic.info/ja/category/subsonic-airlines/

ソースコード

https://github.com/subsonicsystems/subsonic-airlines-members

トランザクション

UserService.javaは、普通のJavaクラスに@Statelessを付けています。

@Stateless
public class UserService {

@Statelessを付けると、そのクラスはEJBのステートレスセッションビーンとなります。

EJBを使うとトランザクション管理ができるようになります。例えば、銀行のATMで振込を行うとします。処理としては、自分の銀行口座の残高から振込金額をマイナスして、振込先の銀行口座に振込金額をプラスするという流れになります。このとき、正常に処理が完了すれば問題ありませんが、途中で処理が失敗して自分の銀行口座の残高が減り、振込先の銀行口座に変化がないということになると困ります。途中で失敗した場合には、すべての処理を元に戻して、ユーザに処理失敗のメッセージを出せるようにしなくてはなりません。このすべての処理を元に戻すことをロールバックといい、トランザクションがそれを可能にします。

@Statelessを付けた場合、デフォルトでトランザクションが有効となります。トランザクションが有効になると、トランザクションの制御はコンテナによって自動的に行われます。

また、トランザクションの制御をコンテナではなく、コード上で制御することもできます。

SQLのトランザクション機能を使わないで、EJBのトランザクション機能を使う利点として、コードを書く際にデットロックについて気にしないでロジックを書くことに専念できることがあります。

セッションビーン

EJBのセッションビーンには、ステートレスセッションビーンとステートフルセッションビーンがあります。これらの違いは、ビーンが状態を持つかどうかで、ステートレスセッションビーンは、状態を持ちません。

ウェブアプリケーションでは、ほとんどの場合ステートフルセッションビーンを使う機会はないと思われます。

UserServiceクラスの呼び出し

InputView.javaでは、userServiceフィールドに@Injectを付けています。

@Inject
private UserService userService;

フィールドに@Injectを付けると、CDIの機能によってそのクラスが注入されます。すなわち、userService = new UserService()としなくても、UserServiceクラスを使うことができるようになります。

例えば、InputView.javaの151行目では、UserServiceのインスタンスを作成せずにUserServiceクラスのexistsUsernameメソッドを呼び出しています。

if (userService.existsUsername(user.getUsername())) {
    String message = resourceBundle.getString("user.username.exists");
    FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, message, message);
    facesContext.addMessage("form:username", facesMessage);
    return false;
}