[RESOLVIDO] Erro Menu Dinamico

1 resposta
JaqueCel

Olá

Estou começando a trabalhar com JSF e estou tendo problemas na geração de menus dinâmicos.

Este é o erro que está ocorrendo:

WARNING: executePhase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@126c885) threw exception
java.lang.IllegalArgumentException: Value binding of UINavigationMenuItem with id j_id___jsp_tag_ctru1:menu:j_id___jsp_tag_ctru1pc2:id_menu1 does not reference an Object of type NavigationMenuItem
	at org.apache.myfaces.custom.navmenu.NavigationMenuUtils.getNavigationMenuItemList(NavigationMenuUtils.java:58)
	at org.apache.myfaces.custom.navmenu.jscookmenu.HtmlJSCookMenuRenderer.encodeChildren(HtmlJSCookMenuRenderer.java:156)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:244)
	at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:175)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
	at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:613)
	at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:362)
	at com.evermind.server.http.HttpRequestHandler.doDispatchRequest(HttpRequestHandler.java:915)
	at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:821)
	at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:626)
	at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:599)
	at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:383)
	at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:161)
	at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:142)
	at oracle.oc4j.network.ServerSocketReadHandler$ClientRunnable.run(ServerSocketReadHandler.java:275)
	at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:237)
	at oracle.oc4j.network.ServerSocketAcceptHandler.access$800(ServerSocketAcceptHandler.java:29)
	at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:878)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
	at java.lang.Thread.run(Thread.java:595)

Eu utilizo JSF + Tomahawk(jscookMenu) rodando pelo OC4J com a IDE JDeveloper.

abaixo segue minhas classes:

minha subview com o menu

<%@ page contentType="text/html;charset=windows-1252"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>

<f:subview id="menu">
    <h:form>
        <input type="hidden" name="jscook_action" id="jscook_action"/>
        <t:jscookMenu layout="hbr" theme="ThemeOffice" styleLocation="/css">
             <t:navigationMenuItem id="id_menu1" value="#{menu.navItems}"/>
        </t:jscookMenu>
    </h:form> 
</f:subview>

meu managedBean

package br.com.metaway.backedbean;

import org.apache.myfaces.custom.navmenu.NavigationMenuItem;

public class DynamicMenuTest {
    private NavigationMenuItem[] navItems;
    
    public DynamicMenuTest() {
        // children for item 2
        NavigationMenuItem[] subItems = new NavigationMenuItem[2];
        subItems[0] = new NavigationMenuItem("Subitem 2_1 Label","#{pessoaCad.actionListaTodos}");
        subItems[1] = new NavigationMenuItem("Subitem 2_2 Label","#{cidadeCad.actionTodos}");
        // item 2
        NavigationMenuItem itemWithChildren = new NavigationMenuItem("Item 2 Label", "");
        itemWithChildren.setNavigationMenuItems(subItems);
        // root items
        navItems = new NavigationMenuItem[3];
        navItems[0] = new NavigationMenuItem("Item 1 Label","");
        navItems[1] = itemWithChildren;
        navItems[2] = new NavigationMenuItem("Item 3 Label","");
    }

    public NavigationMenuItem[] getNavItems() {
        return navItems;
    }

    public void setNavItems(NavigationMenuItem[] navItems) {
        this.navItems = navItems;
    }
}

meu arquivo faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/JSF/Configuration">

    <application>
        <el-resolver>org.springframework.web.jsf.el.DelegatingFacesELResolver</el-resolver>
    </application>
        
    <managed-bean>
        <managed-bean-name>pessoaCad</managed-bean-name>
        <managed-bean-class>br.com.metaway.backedbean.CadPessoa</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>pessoaDAO</property-name>
            <property-class>br.com.metaway.model.dao.PesDAO</property-class>
            <value>#{pDAOImpl}</value>
        </managed-property>
        <managed-property>
            <property-name>cidadeDAO</property-name>
            <property-class>br.com.metaway.model.dao.CidDAO</property-class>
            <value>#{cidDAOImpl}</value>
        </managed-property>
    </managed-bean>    
    
    <managed-bean>
        <managed-bean-name>cidadeCad</managed-bean-name>
        <managed-bean-class>br.com.metaway.backedbean.CadCidade</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>cidadeDAO</property-name>
            <property-class>br.com.metaway.model.dao.CidDAO</property-class>
            <value>#{cidDAOImpl}</value>
        </managed-property>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>menu</managed-bean-name>
        <managed-bean-class>br.com.metaway.backedbean.DynamicMenuTest</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    
    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>login</from-outcome>
            <to-view-id>/TelaIni.jsf</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>listar</from-outcome>
            <to-view-id>/TelaPes.jsf</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>cadastro</from-outcome>
            <to-view-id>/PesCad.jsf</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>listacid</from-outcome>
            <to-view-id>/TelaCid.jsf</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>cadcid</from-outcome>
            <to-view-id>/CidCad.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
    
</faces-config>

A página que ira mostrar o menu

<%@ page contentType="text/html;charset=windows-1252"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

<f:view>
  <html>
    <head>
      <meta http-equiv="Content-Type"
            content="text/html; charset=windows-1252"/>
      <link href="css/style.css" rel="stylesheet" type="text/css" />
      <script src="js/utils.js" type="text/javascript" ></script>
      <title>TelaIni</title>
    </head>
    <body>
        <h:form>
            <table>
                <tr>
                    <td width="100%" align="left" height="10px" colspan="2">
                        <jsp:include page="/menu.jsp" flush="true"/>
                    </td>
                </tr>
            </table>
            <p>
                <h:commandButton value="Pessoas" action="#{pessoaCad.actionListaTodos}"/>
                <h:commandButton value="Cidades" action="#{cidadeCad.actionTodos}"/>
            </p>
        </h:form>
    </body>
  </html>
</f:view>

Meu arquivo web.xml

<?xml version = '1.0' encoding = 'UTF-8'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath:/applicationContext.xml</param-value> 
    </context-param>
        
    <!-- Extensions Filter -->  
    <filter>  
        <filter-name>MyFacesExtensionsFilter</filter-name>  
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>  
        <init-param>  
            <param-name>maxFileSize</param-name>  
            <param-value>20m</param-value>  
        </init-param>  
    </filter>  
    
    <filter-mapping>  
        <filter-name>MyFacesExtensionsFilter</filter-name>  
        <servlet-name>Faces Servlet</servlet-name>  
    </filter-mapping>  
   
    <filter-mapping>  
        <filter-name>MyFacesExtensionsFilter</filter-name>  
        <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>  
    </filter-mapping>  
             
    <servlet>
        <servlet-name>Faces Servlet</servlet-name> 
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name> 
        <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping>
    
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

Se alguém tiver alguma dica ou solução para isso....

obrigada

Jaque

1 Resposta

JaqueCel

E erro estava na página jsp do subview (linha 10 d0 código).
O correto é:

1. <%@ page contentType="text/html;charset=windows-1252"%> 2. <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 3. <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 4. <%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%> 5. 6. <f:subview id="menu"> 7. <h:form> 8. <input type="hidden" name="jscook_action" id="jscook_action"/> 9. <t:jscookMenu layout="hbr" theme="ThemeOffice" styleLocation="/css"> 10. <t:navigationMenuItems value="#{menu.navItems}"/> 11. </t:jscookMenu> 12. </h:form> 13. </f:subview>

Criado 16 de junho de 2008
Ultima resposta 18 de jun. de 2008
Respostas 1
Participantes 1