Search code examples
jsfdatatablefacelets

Command button with EL method argument does not invoke action method


I am trying to delete a database entry by sending the primary key "userId" as EL method argument via a command button to my managed bean.

My current code looks like

Bean:

@ManagedBean
@RequestScoped
public class HibernateUserHandling 
{
...
public void deleteUser(String userIdViaXhtml)
{
    Session session = sessionFactory.openSession();
    session.beginTransaction();

    session.createQuery("DELETE FROM AddressDetails WHERE USERID = :userIdViaXhtml");
    session.createQuery("DELETE FROM UserDetails WHERE USERID = :userIdViaXhtml");

    session.getTransaction().commit();
    session.close();
}
...
}

View:

    <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">
                        ...
                            <f:facet name="header">Delete</f:facet>
                            <h:commandButton id="userId" action="#{hibernateUserHandling['deleteUser(list.userId)']}" image="delete.jpg" />
                        </h:column>
                    </h:dataTable>
                    ...
                </h:form>
            </ui:define>
        </ui:composition>
    </body>
</html>

I tested more ways, e.g. via getting the value to a seperate variable in the bean like in a inputText, but nothing worked.

I think I got a totally wrong basic approach.

I get the following error:

/hibernate.xhtml @39,137 action="#{hibernateUserHandling.deleteUser(list.userId)}" Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]

Stack trace:

    javax.faces.view.facelets.TagAttributeException: /hibernate.xhtml @39,137 action="#{hibernateUserHandling.deleteUser(list.userId)}" Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]
            at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:232)
            at com.sun.faces.facelets.tag.jsf.ActionSourceRule$ActionMapper2.applyMetadata(ActionSourceRule.java:104)
            at com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:81)
            at javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:129)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:102)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.doNewComponentActions(ComponentTagHandlerDelegateImpl.java:402)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:159)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at com.sun.faces.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:103)
            at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:178)
            at com.sun.faces.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:395)
            at com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:366)
            at com.sun.faces.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:108)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)
            at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:308)
            at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:367)
            at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
            at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
            at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
            at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
            at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)
            at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
            at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:769)
            at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
            at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
            at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
            at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
            at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)
            at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)
            at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)
            at java.lang.Thread.run(Thread.java:619)
    Caused by: javax.el.ELException: Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]
            at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:146)
            at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:172)
            at org.apache.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBuilder.java:223)
            at org.apache.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFactoryImpl.java:57)
            at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:222)
            ... 61 more
    Caused by: org.apache.el.parser.ParseException: Encountered " "(" "( "" at line 1, column 35.
    Was expecting one of:
        "}" ...
        "." ...
        "[" ...
        ">" ...
        "gt" ...
        "<" ...
        "lt" ...
        ">=" ...
        "ge" ...
        "<=" ...
        "le" ...
        "==" ...
        "eq" ...
        "!=" ...
        "ne" ...
        "&&" ...
        "and" ...
        "||" ...
        "or" ...
        "*" ...
        "+" ...
        "-" ...
        "/" ...
        "div" ...
        "%" ...
        "mod" ...

            at org.apache.el.parser.ELParser.generateParseException(ELParser.java:2142)
            at org.apache.el.parser.ELParser.jj_consume_token(ELParser.java:2024)
            at org.apache.el.parser.ELParser.DeferredExpression(ELParser.java:113)
            at org.apache.el.parser.ELParser.CompositeExpression(ELParser.java:40)
            at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:114)
            ... 65 more

Solution

  • Your Facelet composition is wrong. Anything outside <ui:composition> is ignored in final view and the template client content needs to go inside <ui:define>. You have the <h:form> outside the template definition <ui:define>, so it is not included in the final view and hence the buttons don't have any form to submit and they just won't seem to work at all.

    Rearrange your Facelet template client as follows:

    <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="userId" action="#{hibernateUserHandling.deleteUser(list.userId)}" image="delete.jpg" />
                    </h:column>
                </h:dataTable>
            </h:form>
        </ui:define>
    </ui:composition>        
    

    See also:


    Unrelated to your concrete problem, the Hibernate code is flawed. But that's subject to a different question.


    Update: as per the stacktrace which you edited afterwards in the question,

    Caused by: javax.el.ELException: Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]
    

    Apparently your environment does not support EL 2.2 at all. You need to make sure that the web.xml is declared conform Servlet 3.0 API and that you're deploying to a Servlet 3.0 compatible servlet container (e.g. Tomcat 7, Glassfish 3, JBoss AS 6, etc).

    See also: