パラメータ受け取り用のBean

【前提条件】

[環境]

【概要】

CDIを使ってJAX-RSでの受け取りパラメータを
Beanにつめます。

【サービスクラス】

package jp.glory.darts.application;

import javax.ejb.LocalBean;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.POST;
import javax.ws.rs.Path;

import com.sun.jersey.api.view.Viewable;

@Path("/service/login")
@RequestScoped
@LocalBean
public class LoginService {

    @Inject
    private LoginView view = null;

    @POST
    public void login() {

        System.out.println(view.getUserId());
        System.out.println(view.getPassword);
    }
}
[インジェクションの開始]

JAX-RSでインジェクションするためには
RequestScopedアノテーションを指定してください。

というよりはCDIの仕様により
CDIのスコープアノテーションをつける必要があるかもしれないです・・・

[Beanのインジェクション]

対象のBeanにInjectアノテーションをつけるだけです。

【インジェクション対象Bean】

package jp.glory.darts.view;

import javax.ws.rs.FormParam;

import com.sun.jersey.api.view.Viewable;

public class LoginView {

    @FormParam("userId")
    private String userId = null;

    @FormParam("password")
    private String password = null;
}
[パラメータの受け取り]

Injectアノテーションによって生成されたBeanは
FormParamアノテーションを読み込み、
プロパティに値を設定してくれます。

【動かすためのJSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>ダーツ ログイン</title>
    </head>
    <body>
        <form action="${pageContext.request.contextPath}/service/login" method="POST">
            <div>
                <span id="userIdLabel">ユーザID</span>
                <span id="userIdInput">
                    <input type="text" name="userId" value="${it.userId}" />
                </span>
            </div>
            <div>
                <span id="passwordLabel">パスワード</span>
                <span id="passwordInput">
                    <input type="password" name="password" value="${it.password}" />
                </span>
            </div>
            <div>
                <input type="submit" value="ログイン" />
            </div>
        </form>
    </body>
</html>

【考察】

このやり方でBeanにまとめる場合、
Beanは画面と一対一にしておく必要がありそうです。

というのも、複数のBeanにFormParamアノテーション
値を設定しようとした場合、
名前がバッティングする可能性があります。

そもそも、このやり方がJAX-RS
アーキテクチャから外れていないのかなぁとかって思ったりも・・・