我已经将下拉菜单与简单对象一起使用,并且始终运行良好。现在,我无法完成这项工作:
我跟随this渲染了下拉列表:
<h:selectOneMenu id="referenced" value="{myController.book}" immediate="true">
<f:selectItems value="#{myController.allBooks}"
var="b" itemValue="#{b}" itemLabel="#{b.title}" />
</h:selectOneMenu>
<h:commandButton action="#{myController.addBook()}" type="submit" value="Add">
<f:ajax render="booklist" />
</h:commandButton>
标题正确显示。但是,当我单击Add
按钮时,对象标题始终为null:
protected Book book = new Book();
....
public void addBook() {
if (book != null) {
System.out.println("adding book " + book.getTitle()); // Always null
}
}
我认为那是因为无法“传递”对象,所以我使用了omnifaces
:
<h:selectOneMenu id="referenced" value="{myController.book}" immediate="true" converter="omnifaces.SelectItemsConverter">
该对象仍然为null。然后,我尝试遵循this advice并在ajax元素中使用侦听器:
<f:ajax listener="#{myController.changeBook}" execute="referenced" event="change" />
(我尝试使用和不使用event
属性)。接收AjaxBehaviorEvent
的方法内部的结果仍然相同。