[Seasar-user:11486] [Teeda] ListなForEachで入力コンポーネントを使ってみました

Applied_MATSUDA Masaaki [E-MAIL ADDRESS DELETED]
2007年 11月 6日 (火) 16:05:26 JST


TigerCatです.

いろいろお世話になってます.


今回は,Teeda 1.0.12 でListなForEachでも更新系の処理が
動くようになってるとのことで,早速やってみようと思った
のですが,うまくいかず・・・

Teedaは現時点最新のSVN(リビジョン3747)を使っています.


たとえば,仕事の役割が一覧で表示されて,その役割の横に
リストボックスがあって登録されているユーザ名を選択で
きるようにしておき,要はそれぞれの役割に人をアサイン
するような要件を想定しているのですが,

画面(edit.html)ではForEachの中身はDtoを割り当てています.
List<TeamDto> memberItems
このDtoのプロパティから役割名を画面に表示します.
このDtoには,リストボックスの選択肢を格納するために
List<Map> memberStaffCodeItems のフィールドを持って
います.

いざ動かすと,入力画面が思ったとおりにちゃんと表示され
ます.
それぞれのリストボックスを適当に選択して,[登録]ボタ
ンを押しますと,
どうも結果が入っているであろうList<TeamDto> memberItems
がnullになってしまうのであります.
下記コードの ★部分です.
よって
teamService.insertOrUpdate(this.memberItems);
は,このサービスクラスの中でidを自動採番しようとして
for(int i=0; i<memberItems.size(); i++) {
をやるところでヌルポってしまっています.


何か勘違いをしているか,まだTeedaが未対応なことをしで
かしているかとは思いますが,原因がわかりましたらご教示
いただけると幸いです.
何卒よろしくお願い致します.

下記,サンプルコードを貼り付けておきます.


<!-- edit.html -->
<html>
<head></head>
<body>
<form id="editForm">
<table>
  <thead>
    <tr>
      <th>役割</th>
      <th>メンバー名</th>
    </tr>
  </thead>
  <tbody id="memberItems">
    <tr id="tereko" class="tereko">
      <td>
        <span id="memberTypeName">切込隊長</span>
        <input id="memberType" type="hidden"/>
      </td>
      <td>
        <select id="memberStaffCode">
          <option value="11111">田中 一朗</option>
          <option value="22222">山田 次郎</option>
        </select>
      </td>
    </tr>
  </tbody>
</table>
<input type="submit" value="登録" id="doOnceRegist"/>
</form>
</body>
</html>


public abstract class AbstractEditPage {

  // ForEachの中身 TeamDtoのリスト
  public List<TeamDto> memberItems;
  public int memberIndex;
  // リストボックスの選択肢
  public List<Map> memberStaffCodeItems;

  // TeamDtoのフィールド
  public Integer memberType;
  public String memberTypeName;
  public String memberStaffCode;

  public Class doOnceRegist() { return null; }
  public Class initialize() { return null; }
  public Class prerender() { return null; }
}


public class EditPage extends AbstractEditPage {

  @EJB
  TeamService teamService;

  @EJB
  TeamDxo teamDxo;

  @Override
  public Class prerender() {
    prepareMemberItems();
    return null;
  }

  @Override
  public Class doOnceRegist() {
    teamService.insertOrUpdate(this.memberItems); // ★
    return FinishPage.class;
  }

  @Override
  public Class initialize() {
    TeamDto teamDto = new TeamDto();
    teamDxo.convert(teamDto, this);
    return null;
  }

  private void prepareMemberItems() {
    this.memberItems = new ArrayList<TeamDto>();
    List<Map> options = new ArrayList<Map>();
    Map<String, String> option;

    // リストボックスの選択肢を埋める.実際にはDBから取得.
    option = new HashMap<String, String>();
    option.put("label", "一人目 太郎");
    option.put("value", "123123");
    options.add(option);

    option = new HashMap<String, String>();
    option.put("label", "二人目 次郎");
    option.put("value", "123123");
    options.add(option);
    // ...

    // ForEachで表示すべくデータ(DTO)を埋める.DBから.
    TeamDto teamDto;
    teamDto = new TeamDto();
    teamDto.memberType = 1;
    teamDto.memberTypeName = "医師";
    teamDto.memberStaffCodeItems = options;
    this.memberItems.add(teamDto);

    teamDto = new TeamDto();
    teamDto.memberType = 2;
    teamDto.memberTypeName = "看護師";
    teamDto.memberStaffCodeItems = options;
    this.memberItems.add(teamDto);
  }
}


public class TeamDto implements Serializable {

	private static final long serialVersionUID = -1818361445287026468L;

	public String id;        // Serviceクラスで自動採番
	public String code;      // Serviceクラスで自動採番
	public Integer version;  // Serviceクラスで自動採番

	public Integer memberType;
	public String memberTypeName;
	public String memberStaffCode;
	public String memberStaffName;

	public List<Map> memberStaffCodeItems; // リストボックス選択肢
}




Seasar-user メーリングリストの案内