getMetaData() 抛出内部 NullPointerException

getMetaData() throws internal NullPointerException

提问人:Alex 提问时间:6/18/2014 更新时间:12/17/2016 访问量:1214

问:

在 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)
Java 反射 NullPointerException ColdFusion-10

评论

0赞 Brad Wood 6/19/2014
由于 CF 是闭源的,因此很难从 CF 工程团队以外的任何人那里得到为什么会发生这种情况的答案。我会在这里提交一个错误报告:bugbase.adobe.com。同时,您可以使用 IsInstanceOf() 来识别组件的类型吗?wikidocs.adobe.com/wiki/display/coldfusionen/IsInstanceOf
0赞 Alex 6/19/2014
不幸的是,isInstanceOf() 需要完全限定的路径。由于我在不同的服务器环境中使用动态映射,因此我不知道确切的路径。通过 getMetaData() 进行反射似乎是最好的方法。好吧,我猜不是。
1赞 Brad Wood 6/19/2014
除非您看到抛出错误的特定性能问题,否则我会坚持使用您所拥有的。就您而言,这可能是最好的解决方案。额外的日志记录可能只是Adobe需要修复的一个错误。如果有问题的日志记录使用 Log4J,则您可能能够找到属性文件并关闭该包的日志记录。Log4J 是一个常见的 Java 日志记录库。stackoverflow.com/questions/4972954/......
0赞 Will Zablocki 12/17/2016
我相信此问题已在 Coldfusion 10 Update 16 中得到解决。有关详细信息,请访问Adobe网站:helpx.adobe.com/coldfusion/kb/...
0赞 Alex 12/17/2016
不,该错误修复与 ORM 相关。该错误仍然发生在 CF10 中,但我不知道 CF11+。我们将错误报告中提到的代码移动到事件而不是事件中,这解决了我们特定情况下的问题。onRequestStartonSessionStart

答:

0赞 Triavanicus 7/9/2014 #1

您可以在 try/catch 块中对 getMetaData() 进行调整,并在 catch 块中将其设置为空,而不是标准的 e.printStackTrace(),因为它对实际应用程序的运行方式并不重要。

评论

1赞 Alex 8/2/2014
内部异常 - 如我的帖子所述 - 不会抛出可以在捕获中捕获的异常事件。
0赞 Tristan Lee 10/17/2014 #2

您的组件多久更换一次?有没有办法将文件的修改时间与引发异常的时间进行比较?我和你一起讨论缓存导致这种情况的可能性。

出于好奇,如果可以的话,在调用之前,是否可以显式地清空 servlet 路径?getMetaData()

getPageContext().getRequest().setAttribute("javax.servlet.include.servlet_path", javaCast("null", ""));

可能有助于满足那里的 NULL 条件,然后求助于调用并可能解决路径问题。request.getServletPath()

我已经检查了我的日志,没有发现这样的错误,但我的电话可能不像你那么频繁。getMetaData()

0赞 Alex 10/17/2014 #3

这似乎与请求(无会话标识符)和会话初始化之间的罕见竞争条件有关,因为 getMetaData() 在 SESSION 范围内的任何元素上使用时都会引发异常,因此它甚至不依赖于自定义组件,而是依赖于 .coldfusion.runtime.SessionScope

不幸的是,很难重现此问题。有时它会发生,但随后不会持续数小时甚至数天。我在Adobe的错误库上提交了一份报告,但除非我能说出重现的步骤,否则他们无法对此进行调查。

评论

0赞 Damien 5/22/2018
错误报告的新 URL:tracker.adobe.com/#/view/CF-3778014