我们公司的项目菜单结构需要加载treeData.xml,treeData_sc.xml,我在点击一个菜单按钮时,没有出现预期的菜单结构,查看了一下控制台,如下:
14:54:05 INFO  [http-8080-1] MenuManageServlet - MenuManageServlet state =loadTree
14:54:05 INFO  [http-8080-1] MenuManageServlet - MenuManageServlet treeDataFile = treeData.xml,treeData_sc.xml
14:54:05 INFO  [http-8080-1] MenuManageServlet -  fileRootPath =/E:/tools/Tomcat6.0/lib/
14:54:05 ERROR [http-8080-1] MenuManageServlet - java.lang.NullPointerException
java.lang.NullPointerException
at com.zznode.tnms.common.web.menu.MenuTreeReader.parseXML2JSONArrayByAccessPorts(MenuTreeReader.java:54)
at com.zznode.tnms.common.web.menu.MenuManageServlet.service(MenuManageServlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:216)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:108)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:195)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)于是我根据出现问题的地方,查找。
先在web.xml文件找到MenuManageServlet,如下:
<servlet>
       <servlet-name>menu</servlet-name>
       <servlet-class>com.zznode.tnms.common.web.menu.MenuManageServlet</servlet-class>
       <init-param>
           <param-name>treeData</param-name>
           <param-value>treeData.xml,treeData_sc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
<servlet-name>menu</servlet-name>
<url-pattern>/menu</url-pattern>
</servlet-mapping>
从而找到MenuManageServlet.java文件,
在service方法里,找到
                   List fileNameList = getFilePath();
于是查看getFilePath方法,如下:
String fileRootPath = getClass().getResource("/").getPath();
    String treeDataFile = getInitParameter("treeData");
logger.info("MenuManageServlet treeDataFile = " + treeDataFile);这是对的,
接着是logger.info(" fileRootPath =" + fileRootPath);
这句话就是刚刚在控制台上输出的“MenuManageServlet -  fileRootPath =/E:/tools/Tomcat6.0/lib/”。
问题:而这个文件是在{pro-root-path}\webapp\WEB-INF\classes下,为什么eclipse去“/E:/tools/Tomcat6.0/lib/”去寻找这两个文件?求有类似经历的大神解惑?分数不多,但敬意是满满的。java 

解决方案 »

  1.   

    你是不是把编译目标文件夹设定为E:/tools/Tomcat6.0/lib?
      

  2.   

    没有啊,我看了下.classpath文件,粘贴出来:
    <?xml version="1.0" encoding="UTF-8"?>
    <classpath>
    <classpathentry kind="src" path="resources/cfg"/>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="pm_core/src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="lib" path="E:/code/java/myeclipse/pm/pmlib/acegi-security-1.0.0.jar"/>
    <classpathentry kind="lib" path="E:/code/java/myeclipse/pm/pmlib/activation-1.1.jar"/>
    <classpathentry kind="lib" path="E:/code/java/myeclipse/pm/pmlib/ajaxanywhere-1.2.jar"/>
    <classpathentry kind="lib" path="E:/code/java/myeclipse/pm/pmlib/antlr-2.7.6.jar"/>
    <classpathentry kind="lib" path="E:/code/java/myeclipse/pm/pmlib/aopalliance-1.0.jar"/>
    //...引入jar配置略
    <classpathentry kind="output" path="bin"/>
    </classpath>
    里面没有将编译目录设为“E:/tools/Tomcat6.0/lib”,而是设为<classpathentry kind="output" path="bin"/>
    奇怪的是,我换了一个tomcat就好使了。