Primefaces数据表cellEdit模式未获得修改的新值

时间:2014-07-10 21:54:07

标签: spring-mvc jsf-2 primefaces

我有一个带有editMode =“cell”的数据表。 我的问题是当我编辑一个单元格(在任一可编辑列中),提交它,转到监听器方法,并尝试使用以下方法获取修改后的值:

event.getNewValue()

它没有反映编辑后的值。它实际上总是返回旧值。 因此bean不会更新。 我做错了什么线索? 我正在使用JavaServer Faces 2.2,Primefaces 5.0和Spring Framework 4.0.3。

感谢您的帮助。

这是XHTML代码:

<p:dataTable id="nieoTable" var="nieo" value="#{nieoController.nieos}"
    editable="true" editMode="cell" widgetVar="cellNieo"
    selectionMode="single" selection="#{nieoController.selectedNieo}"
    rowKey="#{nieo.nieoNumber}" tableStyle="width:auto">

    <p:ajax event="rowSelect" update=":nieoForm:wasIsGrid :nieoForm:paperModsumGrid :nieoForm:effectivityGrid" />
    <p:ajax event="cellEdit" listener="#{nieoController.onEditNieo}" update=":nieoForm:nieoTable :nieoForm:growl" />

    <p:column headerText="Nieo Number">
        <h:outputText value="#{nieo.nieoNumber}" />
    </p:column>
    <p:column headerText="PLM Action Number">
        <p:cellEditor>
            <f:facet name="output">
                <h:outputText id="plmActionNumberOutput" value="#{nieo.plmActionNumber}" />
            </f:facet>
            <f:facet name="input">
                <h:inputText id="plmActionNumberInput" value="#{nieo.plmActionNumber}" />
            </f:facet>
        </p:cellEditor>
    </p:column>
    <p:column headerText="SAP Change Master">
        <p:cellEditor>
            <f:facet name="output">
                <h:outputText id="sapChangeMasterOutput" value="#{nieo.sapChangeMaster}" />
            </f:facet>
            <f:facet name="input">
                <h:inputText id="sapChangeMasterInput" value="#{nieo.sapChangeMaster}" />
            </f:facet>
        </p:cellEditor>
    </p:column>
    <p:column headerText="Command">
        <p:commandButton title="Remove NIEO" icon="ui-icon-trash"
            actionListener="#{nieoController.deleteNieo(nieo)}"
            update=":nieoForm:nieoTable :nieoForm:growl" />
    </p:column>
</p:dataTable>

这是托管bean(控制器)的代码:     

public class NieoController {

    @Autowired
    private NIEOService nieoService;

    public void onEditNieo(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        if(newValue != null && !newValue.equals(oldValue)) {
            FacesContext context = FacesContext.getCurrentInstance();
            NIEO nieo = context.getApplication().evaluateExpressionGet(context, "#{nieo}", NIEO.class);
            nieoService.updateNieo(nieo);

            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Nieo updated", "Old: " + oldValue + ", New:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

2 个答案:

答案 0 :(得分:1)

我发现代码存在问题。 在我的托管bean中,我获得了nieos列表的getter,但不是实际的列表。 当然它永远不会像这样工作。我的名单从未保留在会议中。 所以,我有这个(没有实际的清单):

@Controller
@ManagedBean
@SessionScoped
public class NieoController {
    ...
    @Autowired
    private NIEOService nieoService;
    ...
    public List<NIEO> getNieos(){
        return nieoService.listNieos();
    }
    ...

现在我有了这个:

@Controller
@ManagedBean
@SessionScoped
public class NieoController {
    ...
    @Autowired
    private NIEOService nieoService;
    ...
    public List<NIEO> nieos;

    public List<NIEO> getNieos(){
        if (nieos == null)
            nieos = nieoService.listNieos();
        return this.nieos;
    }
    ...

最后,我忘了给托管bean留一些东西(如果你理解我的意思,;))。现在它有效! 谢谢大家的帮助。有时我们会陷入最简单的事情。

答案 1 :(得分:0)

  

我从event.getNewValue()得到的是我得到的   event.getOldValue(),它们都是实际的旧值。

我也是。我错过了<form>。有了它,它有效!