Faces ActionEvent.getSource всегда null - PullRequest
       2

Faces ActionEvent.getSource всегда null

2 голосов
/ 15 февраля 2012

У меня проблема с тем, что мой Faces ActionEvent возвращает источник, но проверка на! = Null возвращает false. Сумасшедший факт в том, что в режиме отладки я получаю заполненную переменную ActionEvent.

Я разбил код на важные разделы

Bean:

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>

Я не получаю сообщение об ошибке, он просто пропускает блок If из-за "ev.getSource ()! = Null".

Заранее спасибо,

TLS

1 Ответ

3 голосов
/ 15 февраля 2012

ActionEvent не может быть null. Это будет огромная ошибка в используемой реализации JSF. Однако ActionEvent#getSource() не может никогда быть экземпляром HtmlDataTable в этом конкретном случае. Это экземпляр HtmlCommandButton, так как вы вызываете его с <h:commandButton>. Таким образом, весь блок 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);
}

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...