バッキングCDI-Beanにチェックボックスを渡したい。postTest.valuesは単なるLongのリストです。
<h:form>
<h:dataTable value="#{postTest.values}" var="val">
<h:column>
<h:outputLabel value="#{val}"/>
</h:column>
<h:column>
<h:selectBooleanCheckbox value="#{postTest.checked[val]}"/>
</h:column>
</h:dataTable>
<h:commandButton action="#{postTest.process}"/>
</h:form>
アクションメソッドは、チェックされた値を出力する必要があります。しかし、それはただ空です。
@Named
@RequestScoped
public class PostTest {
List<Long> values;
Map<Long, Boolean> checked;
...
public String process() {
logger.info(this.toString() + "Processing");
for (Long l : checked.keySet()) {
logger.info(this.toString() + "\t" + l + ". checked: " + checked.get(l));
}
return "index2";
}
...
}
getChecked()メソッドにロギングを追加すると、列ごとに1回だけ取得され、その内容はまったく変更されていないことがわかります。
この問題は、フォームが値を渡すときにpostTest.valuesが初期化されないという点に関連しているようです。コンストラクター(または@PostConstruct)でpostTest.valuesを初期化すると、チェックされた項目が正しく渡されるためです。
POSTリクエストの実行後にpostTest.valuesを初期化する必要があるのはなぜですか?
それを防ぐ方法はありますか?
または、別のオプションがありますか?たとえば、postTest.valuesがコンストラクターや@PostConstructを使用せずに適切に初期化されていることを確認します。これにより、初期化の前に値を渡します(リスナーを試しましたが、解決されていないようです)。
ありがとう!
ティム