Search code examples
javastruts2listenertomcat6apache-commons-digester

Struts-Menu use in Struts 2.x - MenuContextListener not working


I have thoroughly googled this topic and have turned on debug level for log4j, but the MenuContextListener simply will not start. Here is the info I have:

My web.xml file

 <listener> 
    <listener-class>net.sf.navigator.menu.MenuContextListener</listener-class> 
 </listener> 

 <context-param>   
    <param-name>menuConfigLocation</param-name>   
    <param-value>/WEB-INF/classes/menu-config.xml</param-value>   
 </context-param> 

My menu-config.xml file

<?xml version="1.0" encoding="UTF-8" ?>

<MenuConfig>

<Displayers>
   <Displayer name="TabbedMenu" type="net.sf.navigator.displayer.TabbedMenuDisplayer" />
</Displayers>

<Menus>
   <Menu name="selectAction" title="Select Action" location="SelectAction">
       <Item name="report" title="Report" location="Report"/>
       <Item name="query" title="Query" location="Query"/>
       <Item name="listings" title="Listings" location="Listings"/>
   </Menu>
</Menus>

</MenuConfig>

My log4j info

May 21, 2011 1:02:33 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive myproject.war
context path = /myproject
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.TX
log4j:ERROR Could not instantiate appender named "TX".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
log4j:ERROR Could not find value for key log4j.appender.R
log4j:ERROR Could not instantiate appender named "R".
2011-05-21 13:02:52 MenuContextListener [DEBUG] Starting struts-menu initialization
2011-05-21 13:02:52 MenuContextListener [DEBUG] using menuConfigLocation: /WEBINF/classes/menu-config.xml
May 21, 2011 1:02:52 PM org.apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
May 21, 2011 1:02:52 PM org.apache.catalina.core.StandardContext start
SEVERE: Context [/myproject] startup failed due to previous errors
2011-05-21 13:02:52 MenuContextListener [DEBUG] destroying struts-menu...
May 21, 2011 1:02:52 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
context path = /docs
May 21, 2011 1:02:52 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory examples
context path = /examples
May 21, 2011 1:02:53 PM org.apache.coyote.http11.Http11AprProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
May 21, 2011 1:02:53 PM org.apache.coyote.ajp.AjpAprProtocol start
INFO: Starting Coyote AJP/1.3 on ajp-8009
May 21, 2011 1:02:53 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 35104 ms

So you see the contextInitialize is called for this listener, but the method does not complete because there should be 1 more log statement within MenuContextListener telling us success or failure. Then we suddenly get contextDestroyed called and that is that.


Solution

  • So there was absolutely no log present anywhere that gave me any more information. Nowhere! What I did to find the problem was that I had to painstakingly comb through the source code for struts-main. And what did I find? In MenuRepository.java there was an import of commons-digester. Commons-digester? Where is this mentioned in any documentation or included in any download? I don't use commons digester.

    Here is my take on this, anyone please correct me if I am wrong or affirm if this is somehow right. Back in struts 1.x when this was written, commons-digester was part of the struts package so why mention commons-digester in the struts-menu documentation? That is now no longer the case, so one has to separately download commons-digester. So my conclusion is that there needs to be documentation somewhere as how this package can be successfully combined with struts 2.x.

    Also, can anyone give me any 2011 alternatives to using struts-menu? I have a menu which opens up to the right when the user hovers over it. This is pretty similar to the Velocity CoolWindows example included with struts-menu.