提问人:Alex 提问时间:6/18/2014 更新时间:12/17/2016 访问量:1214
getMetaData() 抛出内部 NullPointerException
getMetaData() throws internal NullPointerException
问:
在 ColdFusion 10 中对组件调用 getMetaData() 似乎会随机抛出内部 NullPointerException。虽然此异常既不会公开也不会影响实际请求(因此对我们的应用程序本身并不重要),但它仍然会快速填充文件。exception.log
我注意到这可能与 ColdFusion 的路径缓存有关,因为我仅在生产服务器上获得这些 NullPointerException 条目。我还注意到,在我使用 getMetaData() 的每个组件上,这个异常只抛出一次,尽管似乎不是每次第一次调用都会触发它。
澄清一下:getMetaData() 运行良好,但它有时会在 ColdFusion 的 exception.log 文件中记录 NullPointerException。
有谁知道解决方案(除了禁用缓存或异常.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)
答:
您可以在 try/catch 块中对 getMetaData() 进行调整,并在 catch 块中将其设置为空,而不是标准的 e.printStackTrace(),因为它对实际应用程序的运行方式并不重要。
评论
您的组件多久更换一次?有没有办法将文件的修改时间与引发异常的时间进行比较?我和你一起讨论缓存导致这种情况的可能性。
出于好奇,如果可以的话,在调用之前,是否可以显式地清空 servlet 路径?getMetaData()
getPageContext().getRequest().setAttribute("javax.servlet.include.servlet_path", javaCast("null", ""));
这可能有助于满足那里的 NULL 条件,然后求助于调用并可能解决路径问题。request.getServletPath()
我已经检查了我的日志,没有发现这样的错误,但我的电话可能不像你那么频繁。getMetaData()
这似乎与请求(无会话标识符)和会话初始化之间的罕见竞争条件有关,因为 getMetaData() 在 SESSION 范围内的任何元素上使用时都会引发异常,因此它甚至不依赖于自定义组件,而是依赖于 .coldfusion.runtime.SessionScope
不幸的是,很难重现此问题。有时它会发生,但随后不会持续数小时甚至数天。我在Adobe的错误库上提交了一份报告,但除非我能说出重现的步骤,否则他们无法对此进行调查。
评论
onRequestStart
onSessionStart