【问题标题】:Faces ActionEvent.getSource always null面对 ActionEvent.getSource 始终为空
【发布时间】: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 将被传递。

标签: jsf datatable


【解决方案1】:

ActionEvent 不能是 null。这将是所使用的 JSF 实现中的一个巨大错误。但是,在这种特殊情况下,ActionEvent#getSource()永远不会成为HtmlDataTable 的实例。这是HtmlCommandButton 的一个实例,因为您是从&lt;h:commandButton&gt; 调用它。所以整个if 块永远不会通过。

也就是说,这是删除当前Person 的一种非常笨拙的方法。也许您过于关注完全过时的基于 JSF 1.x 的书籍/教程/资源。有更好的方法来获取当前的Person,首先是:

<h:dataTable value="#{hibernateDataOutput.persons}" var="person">
    <h:column>
        <h:commandButton action="#{hibernateUserHandling.deleteUser(person)}" image="delete.jpg" />
    </h:column>
</h:dataTable>

public void deleteUser(User user) {
    someUserService.delete(user);
}

另见:

【讨论】:

  • 当我尝试直接调用该方法时,会导致我在主题中编辑的 Stacktrace 错误
  • 所以你之前的问题还没有解决?我已经回答了这是如何引起的以及如何解决这个问题:stackoverflow.com/questions/9278986/… 如需替代方案和其他深入的解释,请点击“另见”链接。
  • 感谢您的解决方案!我再次检查了它,这次它跳过了带有 instanceof 的块。我最后一次尝试它总是跳过 != null 块。但问题是在我的公司,我们从事一种更大的项目实施并使用 tomcat 6。认为我们的经理不会为 tomcat 7 服务器更改它
  • 我强烈建议您解决 EL 问题,或者至少按照“另请参阅”链接了解其他方式。你原来的方式太笨拙了。例如,请改用&lt;f:setPropertyActionListener&gt;
  • 非常感谢您,现在它工作正常! setPropertyActionListener 是解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2017-08-19
  • 2019-07-28
相关资源
最近更新 更多