在ColdFusion 10中的组件上调用getMetaData()似乎随机抛出一个内部NullPointerException。虽然此异常既不会暴露也不会影响实际请求(因此对我们的应用程序本身并不重要),但它仍然会快速填满exception.log
个文件。
我注意到这可能与ColdFusion的路径缓存有关,因为我只在生产服务器上获得这些NullPointerException条目。我还注意到,这个异常只会在我使用getMetaData()的每个组件上抛出一次,尽管不是每次第一次调用都会触发它。
为了澄清:getMetaData()工作得很好,但它有时会在ColdFusion的exception.log文件中记录NullPointerException。
是否有人知道解决方案(禁用缓存或exception.log文件除外)?
背景:
我使用getMetaData()来识别组件,在使用<cfinterface>
时非常有用。
java.lang.NullPointerException
at coldfusion.util.Utils.getServletPath(Utils.java:100)
at coldfusion.util.Utils.getServletPath(Utils.java:90)
at coldfusion.util.Utils.getBaseTemplatePath(Utils.java:419)
at coldfusion.runtime.TemplateProxyFactory.getTemplateFileHelper(TemplateProxyFactory.java:1567)
at coldfusion.runtime.MetadataUtils.getComponentMetadata(MetadataUtils.java:112)
at coldfusion.runtime.CfJspPage.GetComponentMetadata(CfJspPage.java:2744)
at coldfusion.runtime.TemplateProxy.getRuntimeComponentMetadata(TemplateProxy.java:1940)
at coldfusion.runtime.TemplateProxy.getRuntimeMetadata(TemplateProxy.java:1801)
at coldfusion.runtime.MetadataUtils.getMetaData(MetadataUtils.java:54)
at coldfusion.runtime.CfJspPage.GetMetadata(CfJspPage.java:2717)
答案 0 :(得分:0)
你可以在try / catch块中使用getMetaData(),并且在catch块内部使其为空,而不是标准的e.printStackTrace(),因为它对于实际应用程序的运行方式并不重要。 / p>
答案 1 :(得分:0)
您的组件多久更换一次?有没有办法比较文件被修改的时间与抛出异常的时间?我和你在一起有关缓存的可能性。
出于好奇,如果你能够,在getMetaData()
调用之前,你能否明确地将servlet路径为空?
getPageContext().getRequest().setAttribute("javax.servlet.include.servlet_path", javaCast("null", ""));
可以帮助满足那里的NULL条件,然后调用request.getServletPath()
并可能解决路径问题。
我已经检查了我的日志,但没有发现这样的错误,但我对getMetaData()
的调用可能并不像你的那样频繁。
答案 2 :(得分:0)
似乎与请求(没有会话标识符)和会话初始化之间的罕见竞争条件有关,因为getMetaData()在使用SESSION范围中的任何元素时抛出异常,因此它甚至不依赖在自定义组件上,而是coldfusion.runtime.SessionScope
。
不幸的是,重现这个问题非常困难。有时它会发生,但它不会持续数小时甚至数天。 I filed a report at Adobe's bugbase,但除非我能说出重现的步骤,否则他们无法研究。