Я хочу передать флажки в CDI-Бин. postTest.values - это просто список длин.h: selectBooleanCheckbox не передает результат на карту
<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() метод, я могу видеть, что он просто извлекается один раз в колонку и его содержание не изменилось.
Проблема, как представляется, связаны с точкой, что postTest.values не инициализируется, когда форма передает значения. Поскольку, если я инициализирую postTest.values в конструкторе (или @PostConstruct), проверенные элементы передаются правильно.
Зачем мне нужно инициализировать postTest.values вообще после выполнения запроса POST?
Есть ли способ предотвратить это?
Или у меня есть другой вариант? Например. убедитесь, что postTest.values инициализированы правильно, не используя конструктор или @PostConstruct, поэтому я хочу передать ему значения перед инициализацией (я пробовал прослушиватели, но они, похоже, не решают этого).
Спасибо!
Tim
Я подозреваю, что ваша проблема в том, что область действия невелика. Подсчет запросов рассчитывается только для рендеринга страницы - при первом доступе к странице. В форме submit (postback) создается новый bean-компонент и значения должны быть повторно инициализированы. Попробуйте увеличить масштаб до чего-то большего - например, сеанса. –