JSF 2.2动态h:selectOneMenu在p:dataTable中提交旧值

时间:2014-07-09 09:41:19

标签: java null selectonemenu

我坚持这个当前的问题,也许有人可以帮我解决这个问题: 我尝试构建一个基于JSF 2.2和最新的primefaces版本(5.0)的动态Ruleseditor。 因此,我构造了一个p:dataTable,它在单独的列中显示规则值。要编辑值,编辑器会从使用过的数据库表中生成可选择的Valuelist。

一切正常但如果我尝试在可选值列表中选择另一个值并单击保存按钮,则旧值将提交给bean,而h:selectOneMenu将显示上次使用的值。

我尝试了很多解决方案,但这是JSF方面的最新消息:

<h:form id="ruleTableForm">
<p:dataTable value="#{table.rules}" var="rule">
    <p:columns var="column" value="#{table.columns}" headerText="#{column.header}" width="250">
        <h:selectOneMenu id="columnSelectMenu" value="#{rule.ruleColumnToValueMap[column].value}">
            <f:selectItems value="#{column.pickList.entrySet()}"
                    var="pickItem" itemLabel="#{pickItem.value}"
                    itemValue="#{pickItem.key}" />
        </h:selectOneMenu>
    </p:columns>
</p:dataTable>
<div class="button_group">
    <h:commandLink styleClass="add_button" action="#{regelEditorViewController.saveRuleset()}">Save</h:commandLink>
</div>
</h:form>

我的ViewController的xhtml-File中使用的部件如下所示:

@ManagedBean
@ViewScoped
public class RegelEditorViewController implements Serializable { 

private RegelEditorViewData viewData;

@Produces
public RegelEditorViewData getViewData() {
    if (this.viewData == null) {
        this.viewData = this.viewDataService.produceViewData(0L,20L);
    }
    return this.viewData;
}

public void saveRuleset() {
    RulesetViewData rulesetViewData = this.viewData.getCurrentRuleset();
    this.viewDataService.saveRuleset(rulesetViewData);
    this.refreshViewData();
}
}

ruleColumnToValueMap是Map:

private Map<RuleTableColumnViewData, Value> ruleColumnToValueMap = new LinkedHashMap<RuleTableColumnViewData, Value>();

...&#34; pickList&#34;在&#34; ruleTableColumnViewData&#34; -object也是带字符串的地图:

private Map<String, String> pickList = new LinkedHashMap<String, String>();

我尝试但不起作用的解决方案:

使用ajax setter,它选择值(但在setter方法中值为null)

<f:ajax listener="#{regelEditorViewController.selectedRuleColumnValueChanged(table, rule,    column, rule.ruleColumnToValueMap[column].value)}" render="@form" />

使用即时的ajax setter,它始终将最后设置的值发送给bean:

<f:ajax listener="#{regelEditorViewController.selectedRuleColumnValueChanged(table, rule, column, rule.ruleColumnToValueMap[column].value)}" immediate="true" render="@form" />

尝试使用p:selectOneMenu,但似乎非常错误:无法更改所选项目,组件不显示菜单

尝试使用&#34; SelectItem&#34;在&#34; pickList&#34;列表和&#34; SelectItem&#34;对于&#34; ruleColumnToValueMap&#34;中的列;图

也许某人有可能帮助我的解决方案?

1 个答案:

答案 0 :(得分:0)

上面的例子这个答案是正确的,失败的是控制器没有将数据保存到数据库!