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 !!!