getMetaData()抛出内部NullPointerException

时间:2014-06-18 12:16:15

标签: java reflection coldfusion nullpointerexception coldfusion-10

在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)

3 个答案:

答案 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,但除非我能说出重现的步骤,否则他们无法研究。