Jboss seam tomahaw integration of jscookmenu
slarchet Jun 29, 2006 8:16 AMhi everybody
I'm currently facing a strange pb between Tomahawk and Jboss Seam.
It looks like NavigationMenuItem[] object returned by my Stateless Bean lose some cast information's when it's handled by NaviagtionMenuUtils class of tomahawk package.
My test configuration is :
a superMenu.jsp contains a JsCookMenu tag that dynamically get menu items from a stateless bean.
my software cfg:
Jboss is 4.04.GA
Seam is 1.0.1
MyFaces 1.1.3
Tomahawk 1.1.3
Linus RH Enterpise 4.XX
JDK Sun 1.5.0_05-b05
my Stateless Bean source taht returns the array of NavigationMenuItem:
import static org.jboss.seam.ScopeType.STATELESS; import java.io.Serializable; import org.jboss.seam.annotations.*; import org.jboss.seam.log.Log; import org.apache.myfaces.custom.navmenu.NavigationMenuItem; @Name("mainMenu") @Scope(STATELESS) public class MainMenu implements Serializable { @Logger private Log log; public MainMenu() { } public NavigationMenuItem[] getNavItems() { NavigationMenuItem[] navItems=new NavigationMenuItem[2]; navItems[0]=new NavigationMenuItem("Item 1 Label","action1"); navItems[1]=new NavigationMenuItem("Item 3 Label","action3"); System.out.println("produced class name="+navItems.getClass().getName()); return navItems; } }
my jsp source wich invoke mainMenu.navItems
<?xml version="1.0" encoding="UTF-8" ?> <%@ 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"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- JSCook Menu --> <script language="JavaScript" src="jscookmenu/JSCookMenu.js" type="text/javascript"> </script> <script language="JavaScript" src="jscookmenu/ThemeOffice/theme.js" type="text/javascript"> </script> <link rel="stylesheet" href="jscookmenu/ThemeOffice/theme.css" type="text/css"/> <script language="JavaScript" src="jscookmenu/ThemeIE/theme.js" type="text/javascript"> </script> <link rel="stylesheet" href="jscookmenu/ThemeIE/theme.css" type="text/css"/> <title>Insert title here</title> </head> <body> <f:view> <h:form> <t:jscookMenu id="menu2" layout="hbr" theme="ThemeIE"> <t:navigationMenuItems value="#{mainMenu.navItems}" /> </t:jscookMenu> </h:form> </f:view> </body> </html>
part of org.apache.myfaces.custom.navmenu.NaviagtionMenuUtils (addNavigationMenuItems method) class that I decorated with a System.out.println in order to make simple checking and follow progress of objects in Eclipse debugger.
public static void addNavigationMenuItems(UISelectItems child, List list) { Object value = child.getValue(); System.out.println("returned class name="+value.getClass().getName()); if (value instanceof NavigationMenuItem) { list.add(value); } else if (value instanceof NavigationMenuItem[]) { for (int i = 0; i < ((NavigationMenuItem[])value).length; i++) { list.add(((NavigationMenuItem[])value)); } } else if (value instanceof Collection) { for (Iterator it = ((Collection)value).iterator(); it.hasNext();) { Object item = it.next(); if (!(item instanceof NavigationMenuItem)) { FacesContext facesContext = FacesContext.getCurrentInstance(); throw new IllegalArgumentException("Collection referenced by UINavigationMenuItems with id " + child.getClientId(facesContext) + " does not contain Objects of type NavigationMenuItem"); } list.add(item); } } else { FacesContext facesContext = FacesContext.getCurrentInstance(); throw new IllegalArgumentException("Value binding of UINavigationMenuItems with id " + child.getClientId(facesContext) + " does not reference an Object of type NavigationMenuItem, NavigationMenuItem[], Collection or Map"); } }
exception returned is :
2006-06-29 15:55:42,367 DEBUG [org.jboss.seam.jsf.SeamVariableResolver] resolving name: mainMenu 2006-06-29 15:55:42,367 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.process 2006-06-29 15:55:42,368 DEBUG [org.jboss.seam.Component] instantiating Seam component: mainMenu 2006-06-29 15:55:42,380 DEBUG [org.jboss.seam.jsf.SeamVariableResolver] resolved name to seam component 2006-06-29 15:55:42,388 DEBUG [org.jboss.mx.loading.RepositoryClassLoader] setRepository, repository=org.jboss.mx.loading.HeirarchicalLoaderRepository3@181e7fe, cl=org.jboss.mx.loading.HeirarchicalLoaderRepository3$CacheClassLoader@c7f06{ url=null ,addedOrder=0} 2006-06-29 15:55:42,388 INFO [STDOUT] produced class name=[Lorg.apache.myfaces.custom.navmenu.NavigationMenuItem; 2006-06-29 15:55:42,391 INFO [STDOUT] returned class name=[Lorg.apache.myfaces.custom.navmenu.NavigationMenuItem; 2006-06-29 15:55:42,431 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/test-seam].[jsp]] Servlet.service() for servlet jsp threw exception java.lang.IllegalArgumentException: Value binding of UINavigationMenuItems with id _id0:_id1 does not reference an Object of type NavigationMenuItem, NavigationMenuItem[], Collection or Map at org.apache.myfaces.custom.navmenu.NavigationMenuUtils.addNavigationMenuItems(NavigationMenuUtils.java:145) at org.apache.myfaces.custom.navmenu.NavigationMenuUtils.getNavigationMenuItemList(NavigationMenuUtils.java:100) at org.apache.myfaces.custom.navmenu.jscookmenu.HtmlJSCookMenuRenderer.encodeChildren(HtmlJSCookMenuRenderer.java:161) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:319) at javax.faces.webapp.UIComponentTag.encodeChildren(UIComponentTag.java:343) at javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:251) at org.apache.jsp.superMenu_jsp._jspx_meth_t_jscookMenu_0(superMenu_jsp.java:181) at org.apache.jsp.superMenu_jsp._jspx_meth_h_form_0(superMenu_jsp.java:148) at org.apache.jsp.superMenu_jsp._jspx_meth_f_view_0(superMenu_jsp.java:117) at org.apache.jsp.superMenu_jsp._jspService(superMenu_jsp.java:82) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234) at org.jboss.seam.jsf.SeamViewHandler.renderView(SeamViewHandler.java:59) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:352) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:595) 2006-06-29 15:55:42,434 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/test-seam].[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception javax.faces.FacesException: Value binding of UINavigationMenuItems with id _id0:_id1 does not reference an Object of type NavigationMenuItem, NavigationMenuItem[], Collection or Map at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:421) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234) at org.jboss.seam.jsf.SeamViewHandler.renderView(SeamViewHandler.java:59) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:352) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:595) Caused by: org.apache.jasper.JasperException: Value binding of UINavigationMenuItems with id _id0:_id1 does not reference an Object of type NavigationMenuItem, NavigationMenuItem[], Collection or Map at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:415) ... 25 more
I can produce the same kind of error If return a List of NavigationMenuItem instead of an array. In this case, the List instance is properly recognized but items returned by iteration aren't detected as NavigationMenuItem.
I 'm now stucked on this pb since a week.
I haven't seen any pb of this kind posted here, I hope that's only a configuration pb from me.
please help !!!