Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf Faces ActionEvent.getSource始终为空_Jsf_Datatable - Fatal编程技术网

Jsf Faces ActionEvent.getSource始终为空

Jsf Faces ActionEvent.getSource始终为空,jsf,datatable,Jsf,Datatable,我有一个问题,我的Faces ActionEvent返回一个源,但是检查!=null返回false。 疯狂的事实是,在调试模式下,我得到一个填充的ActionEvent变量 我已将代码分解到重要部分 豆子: 视图: 删除 我没有得到错误,它只是跳过If块,因为“ev.getSource()!=null” 提前感谢, TLS操作事件不能为null。这将是所使用的JSF实现中的一个巨大缺陷。但是,在这种特殊情况下,ActionEvent#getSource()可以是htmldataable的实例

我有一个问题,我的Faces ActionEvent返回一个源,但是检查!=null返回false。 疯狂的事实是,在调试模式下,我得到一个填充的ActionEvent变量

我已将代码分解到重要部分

豆子:

视图:


删除
我没有得到错误,它只是跳过If块,因为“ev.getSource()!=null”

提前感谢,


TLS

操作事件
不能为
null
。这将是所使用的JSF实现中的一个巨大缺陷。但是,在这种特殊情况下,
ActionEvent#getSource()
可以是
htmldataable
的实例。它是
HtmlCommandButton
的一个实例,因为您是从
调用它的。因此,整个
if
块将永远不会通过

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

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

您确定这是因为检查为null而不是instanceof check吗?可能源代码是UICommand?我将检查分为2个if块,并在null失败;)您的
deleteUser
方法不是直接从JSF调用的,而是从
hibernateUserHandling
隐式调用的,它传递了一个似乎是使用反射调用bean参数的方法名参数。如果我想说的话,那就是你问题的原因。为什么不直接调用托管bean deleteUser action listener方法?@maple_shaft在我的环境中,直接调用HibernateUserHandling.deleteUser()不起作用,因此我必须像调用HibernateUserHandling['deleteUser']@TLS一样调用它,根据actionListener的stacktrace,您不需要括号。它假设ActionEvent将被传递。当我尝试直接调用该方法时,它会导致我在topicSo中编辑的Stacktrace错误。您还没有修复以前的问题吗?我已经回答了这是如何造成的以及您如何解决这一问题:对于替代方案和其他深入的解释,请遵循“请参阅”链接。感谢您的解决方案!我再次检查了它,这次它跳过了instanceof的块。上次我试过它时,它总是跳过空块。但问题是,在我的公司,我们正在进行一种更大的项目实施,并使用Tomcat6。我想我们的经理不会为tomcat 7服务器更改它。我强烈建议您解决EL问题,或者至少按照“请参阅”链接了解其他方法。你原来的方式太笨拙了。例如,请改用
。非常感谢您,现在它工作正常!setPropertyActionListener就是解决方案。
<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>
<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);
}