我有一个带有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);
}
}
答案 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>
。有了它,它有效!