我面临着<f:setPropertyActionListener>
标签的奇怪行为。有时甚至更奇怪的是,随机它会停止工作,因此在行动开始之前不会调用setter方法(我已经快速翻译了意大利语中的消息,只是为了告诉你要做什么)。
这是:
<p:treeTable value="#{addestramentoController.addestramenti}"
id="addestramentiTree"
var="addr" scrollable="true"
scrollHeight="200"
emptyMessage="No training in database.">
<f:facet name="header">
Training List
</f:facet>
<p:column .... />
<p:column style="width:20px; text-align: center">
<p:commandLink rendered="#{(addr.dataAddestramento ne null)}"
oncomplete="PF('confirmDlg').show()"
title="Delete training"
styleClass="ui-icon ui-icon-closethick">
<f:setPropertyActionListener value="#{addr}"
target="{addestramentoController.item}"/>
</p:commandLink>
</p:column>
</p:treeTable>
这是对话框,在同一页面和同一表格内:
<!-- Confirm Dialog -->
<p:confirmDialog id="confirm"
widgetVar="confirmDlg"
message="Delete training?"
header="Confirm"
severity="alert"
closeOnEscape="true">
<p:commandButton value="Yes"
action="#{addestramentoController.doDelete}"
update="addestramentiTree nuovoAddestramento"
oncomplete="PF('confirmDlg').hide();"
icon="ui-icon-check"/>
<p:commandButton value="No" type="button"
onclick="PF('confirmDlg').hide();"
icon="ui-icon-close"/>
</p:confirmDialog>
<!-- ////////////// -->
使用Java EE 7 CDI批注完成AddestramentoController
辅助bean。以下是相关部分:
public void setItem(VolAddestramento item) {
// Really this should NEVER happen!
if (item == null) {
setDialogMessage(new DialogMessage("Error", "Error Message"));
}
this.item = item;
}
public void doDelete() {
// Delete selected training
aServ.deleteAddestramento(item);
// Update table data
fillAddestramenti();
}
EJB中的 aServ
,一切正常,但有时不行。根本没有调用setItem
导致EJB服务方法中的NPE。正如您在<p:dialog>
中看到的那样,我使用了action
,但我也尝试过actionListener
。我不知道我的代码中有什么问题,但它与PrimeFaces展示中使用的相同,应该开箱即用。我在开发测试期间从未遇到过这个问题,只是(显然)在部署环境中发生。
这些是我的开发和部署设置:
开发:JDK 8u25_x64 - NB 8.0.2 - 使用Mojarra 2.2.7 impl的PrimeFaces 5.1社区的GF 4.1。
部署:JDK 8u25_x64 - Wildfly 8.0.0Final with Mojarra 2.2.5-jbossorg-3
也许是Mojarra的问题?
感谢您的时间。
编辑:好吧,忘了告诉......支持bean是ViewScoped
。