【问题标题】:getMetaData() throws internal NullPointerExceptiongetMetaData() 抛出内部 NullPointerException
【发布时间】:2014-08-08 17:42:54
【问题描述】:

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

【问题讨论】:

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

标签: java reflection coldfusion nullpointerexception coldfusion-10


【解决方案1】:

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

【讨论】:

  • 内部异常 - 正如我的帖子中所述 - 不会引发可以在 catch 中捕获的异常事件。
【解决方案2】:

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

出于好奇,如果您能够在调用getMetaData() 之前,您能否明确地将servlet 路径设为NULL?

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

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

我检查了我的日志并没有发现这样的错误,但很可能我对getMetaData() 的调用没有你那么频繁。

【讨论】:

    【解决方案3】:

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

    不幸的是,重现此问题非常困难。有时它会发生,但它不会持续数小时甚至数天。 I filed a report at Adobe's bugbase,但除非我能说出重现的步骤,否则他们无法对此进行调查。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-11
    • 2013-09-07
    • 2013-06-18
    • 2016-07-07
    • 2014-10-02
    • 2012-05-21
    • 2014-08-15
    • 2013-08-06
    相关资源
    最近更新 更多