Non-standard behaviour of t:navigationMenuItem (in t:jscookMenu) breaks facelets
--------------------------------------------------------------------------------

         Key: MYFACES-697
         URL: http://issues.apache.org/jira/browse/MYFACES-697
     Project: MyFaces
        Type: Bug
  Components: Tomahawk  
    Reporter: Erik-Berndt Scheper


Non-standard behaviour of t:navigationMenuItem (in t:jscookMenu) breaks 
facelets in two ways:
Consider the following menu:

        <t:jscookMenu layout="hbr" theme="ThemeOffice" >
            <!-- Hoofdmenu ==> link naar startscherm (home) -->
                <t:navigationMenuItem id="nav_home" 
                                itemLabel="#{msg['label.menu.home']}" 
                                action="home" />

            <t:navigationMenuItem id="nav_medewerker" 
itemLabel="#{msg['label.menu.medewerkers']}" >
                    <t:navigationMenuItem id="nav_mw_toev" 
                        itemLabel="#{msg['label.menu.medewerkers.toevoegen']}"
                        
action="#{medewerkerToevoegenHandler.initializeHandlerAction}" />
                <t:navigationMenuItem id="nav_mw_wijzig" 
                        itemLabel="#{msg['label.menu.medewerkers.wijzigen']}"
                        
action="#{medewerkerWijzigenHandler.initializeHandlerAction}"/>
                </t:navigationMenuItem>
        </t:jscookMenu>

This leads to the following exception in facelets

An Error Occurred:
value
+- Stack Trace

java.lang.NullPointerException: value
        at javax.faces.model.SelectItem.<init>(SelectItem.java:69)
        at 
org.apache.myfaces.custom.navmenu.NavigationMenuItem.<init>(NavigationMenuItem.java:50)
        at 
org.apache.myfaces.custom.navmenu.NavigationMenuItem.<init>(NavigationMenuItem.java:65)
        at 
org.apache.myfaces.custom.navmenu.NavigationMenuUtils.getNavigationMenuItemList(NavigationMenuUtils.java:63)
        at 
org.apache.myfaces.custom.navmenu.jscookmenu.HtmlJSCookMenuRenderer.encodeChildren(HtmlJSCookMenuRenderer.java:120)
        at 
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:319)
        at 
org.apache.myfaces.renderkit.RendererUtils.renderChild(RendererUtils.java:444)
        at 
org.apache.myfaces.renderkit.html.HtmlGridRendererBase.renderChildren(HtmlGridRendererBase.java:203)
        at 
org.apache.myfaces.renderkit.html.HtmlGridRendererBase.encodeEnd(HtmlGridRendererBase.java:85)

The reason is non standard behaviour in class 
org.apache.myfaces.custom.navmenu.HtmlNavigationMenuItemTag.java.
The setProperties() method in this class sets itemValue to "0". In method 
getNavigationMenuItemList() of 
org.apache.myfaces.custom.navmenu.NavigationMenuUtils this property (itemValue) 
is used as the value property of a newly created instance  of 
NavigationMenuItem (which extends SelectItem).

However, in facelets the setProperties() method is never used, (all supported 
properties of the tag are set indivually) and the itemValue is null when the 
new instance of NavigationMenuItem is created. This leads to a nullpointer 
exception in the constructor of SelectItem (called by the constructor of 
NavigationMenuItem)

Others have been reporting the same problem. See 
http://www.mail-archive.com/[email protected]/msg09857.html

The easy fix is to add a property itemValue="0" to all navigationmenuitem tags. 
I.e.

        <t:jscookMenu layout="hbr" theme="ThemeOffice" >
            <!-- Hoofdmenu ==> link naar startscherm (home) -->
                <t:navigationMenuItem id="nav_home" 
                                itemLabel="#{msg['label.menu.home']}" 
itemValue="0" 
                                action="home" />

            <!-- Hoofdmenu ==>  submenu: Medewerkers -->
            <t:navigationMenuItem id="nav_medewerker" 
itemLabel="#{msg['label.menu.medewerkers']}" itemValue="0">
                    <t:navigationMenuItem id="nav_mw_toev" 
                        itemLabel="#{msg['label.menu.medewerkers.toevoegen']}" 
itemValue="0"
                        
action="#{medewerkerToevoegenHandler.initializeHandlerAction}" />
                <t:navigationMenuItem id="nav_mw_wijzig" 
                        itemLabel="#{msg['label.menu.medewerkers.wijzigen']}" 
itemValue="0"
                        
action="#{medewerkerWijzigenHandler.initializeHandlerAction}"/>
                </t:navigationMenuItem>
        </t:jscookMenu>

This fixes the nullpointer exception, but leads to a new stack trace in 
facelets:

An Error Occurred:
/pages/layout/menu.jsp @28,80 
action="#{medewerkerToevoegenHandler.initializeHandlerAction}": Bean: 
nl.ibgroep.demo.web.handler.medewerker.MedewerkerToevoegenHandler, property: 
initializeHandlerAction
+- Stack Trace

javax.faces.el.PropertyNotFoundException: /pages/layout/menu.jsp @28,80 
action="#{medewerkerToevoegenHandler.initializeHandlerAction}": Bean: 
nl.ibgroep.demo.web.handler.medewerker.MedewerkerToevoegenHandler, property: 
initializeHandlerAction
        at 
com.sun.facelets.el.LegacyValueBinding.getValue(LegacyValueBinding.java:58)
        at 
org.apache.myfaces.custom.navmenu.UINavigationMenuItem.getAction(UINavigationMenuItem.java:89)
        at 
org.apache.myfaces.custom.navmenu.NavigationMenuUtils.getNavigationMenuItemList(NavigationMenuUtils.java:63)
        at 
org.apache.myfaces.custom.navmenu.NavigationMenuUtils.getNavigationMenuItemList(NavigationMenuUtils.java:75)
        at 
org.apache.myfaces.custom.navmenu.jscookmenu.HtmlJSCookMenuRenderer.encodeChildren(HtmlJSCookMenuRenderer.java:120)


The reason is obvious: the action property of a navigationMenuItem is not 
recognized as a methodbinding. Because NavigationMenuItem is not assignable 
from ActionSource, the action property is assumed to be a JavaBean property. 
I.e. the renderer calls getInitializeHandlerAction() to render the view! 
Whereas I would like the initializeHandlerAction() method to be called when the 
menuitem is selected...

I have no workaround for this. The only solution seems to be the use of 
hardcoded actions such as specified below.

        <t:jscookMenu layout="hbr" theme="ThemeOffice" >
            <!-- Hoofdmenu ==> link naar startscherm (home) -->
                <t:navigationMenuItem id="nav_home" 
                                itemLabel="#{msg['label.menu.home']}" 
itemValue="0" 
                                action="home" />

            <!-- Hoofdmenu ==>  submenu: Medewerkers -->
            <t:navigationMenuItem id="nav_medewerker" 
itemLabel="#{msg['label.menu.medewerkers']}" itemValue="0">
                    <t:navigationMenuItem id="nav_mw_toev" 
                        itemLabel="#{msg['label.menu.medewerkers.toevoegen']}" 
itemValue="0"
                        action="medewerkerToevoegen" />
                <t:navigationMenuItem id="nav_mw_wijzig" 
                        itemLabel="#{msg['label.menu.medewerkers.wijzigen']}" 
itemValue="0"
                        action="medewerkerWijzigen"/>
                </t:navigationMenuItem>
        </t:jscookMenu>





-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to