【发布时间】:2012-02-15 10:29:28
【问题描述】:
我遇到的问题是我的 Faces ActionEvent 返回一个源,但检查 != null 返回 false。 疯狂的事实是,在调试模式下,我得到了一个填充的 ActionEvent 变量。
我已将代码分解为重要部分
豆子:
public class HibernateUserHandling
{
public void deleteUser(ActionEvent ev)
{
if (ev.getSource() != null && ev.getSource() instanceof HtmlDataTable) {
HtmlDataTable objHtmlDataTable = (HtmlDataTable) ev.getSource();
setRowOfUserToDelete(objHtmlDataTable.getRowIndex());
setPersonsCopy(HibernateDataOutput.persons);
setUserToDelete(getPersonsCopy()[getRowOfUserToDelete()]);
setUserIdToDelete((Integer) getUserToDelete().getUserId());
}
}
查看:
<html>
<body>
<ui:composition template="./generalTemplate.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:define name="content">
<h:outputStylesheet library="css" name="cssHibernate.css" />
<h:form id="main">
<h:dataTable value="#{hibernateDataOutput.persons}" var="list"
styleClass="order-table"
headerClass="order-table-header"
rowClasses="order-table-odd-row,order-table-even-row">
<h:column>
<f:facet name="header">Delete</f:facet>
<h:commandButton id="delete" actionListener="#{hibernateUserHandling['deleteUser']}" image="delete.jpg"/>
</h:column>
</h:dataTable>
</h:form>
</ui:define>
</ui:composition>
</body>
</html>
我没有收到错误,它只是因为“ev.getSource() != null”而跳过了 If 块。
提前致谢,
TLS
【问题讨论】:
-
你确定是因为 null 而不是 instanceof 检查吗?也许源是一个 UICommand?
-
我将检查分成 2 个 if 块,并且 instanceof 在 != null 失败时通过;)
-
您的
deleteUser方法不是直接从 JSF 调用的,而是似乎是从hibernateUserHandling隐式调用的,传递了似乎是使用反射调用 bean 参数的方法名称参数。如果有什么我会说这是你的问题的原因。为什么不直接调用托管 bean deleteUser 操作监听器方法? -
@maple_shaft 在我的环境中,直接调用 HibernateUserHandling.deleteUser() 不起作用,所以我必须像 HibernateUserHandling['deleteUser'] 一样调用它
-
@TLS 根据您对 actionListener 的堆栈跟踪,您不需要括号。它假定 ActionEvent 将被传递。