【问题标题】:Intermittent Grails Exception: MissingMethodException间歇性 Grails 异常:MissingMethodException
【发布时间】:2016-06-29 01:33:23
【问题描述】:

我们的生产系统和一些测试系统存在问题。我们在视图中出现了间歇性 Grails 异常。

方法没有签名:静态 org.apache.commons.lang.StringUtils.isNotBlank() 适用于参数类型:(null) 值:[null] 可能的解决方案:isNotBlank(java.lang.String), isBlank( java.lang.String)

该错误似乎表明 Grails 似乎无法弄清楚它应该使用 StringUtils.isNotBlank(String) 应该在将 null 传递给它时使用。

我们注意到:

  • 在生产过程中,问题出现了,并且花了 12 多个小时才似乎神奇地消失了。搜索日志似乎表明没有重新启动。
  • 一位开发人员早上在测试系统上没有发现任何问题。几个小时后,他能够重现它。为了解决这个问题,我们重新启动了 Tomcat。

我不确定 Grails 版本是什么或如何检查它。如果您在下面评论如何找到它,我很乐意使用 Grails 版本编辑问题。

  • 是什么原因造成的?有没有办法可以可靠地重现它?
  • 是否有可靠的解决方法?

【问题讨论】:

标签: grails


【解决方案1】:

我可以通过运行在控制台中重现这个:

org.apache.commons.lang.StringUtils.isNotBlank((Object)null) => Your Error

只传递 null 允许编译器将 null 强制转换为字符串:

org.apache.commons.lang.StringUtils.isNotBlank(null) => false

您传入的任何内容都可能被严格键入为 String 以外的内容,但为 null。 Groovy 编译器在强制类型方面非常聪明,但我已经看到它在一些简单的情况下崩溃了。如果使用 @CompileStatic 和/或使用本机 Java 对象,则尤其如此。

【讨论】:

  • 知道为什么问题是间歇性的,以及为什么重启可以解决问题
  • 我想知道 No signature 错误是否只是真正问题的症状。也许有些东西会间歇性地导致将 null 的非 String 类型传递给该方法。我将开始查看方法的所有调用者以及正在传递的参数的来源。
【解决方案2】:

一个可靠的解决方法是我们重新启动应用程序。

可怕的答案,我知道。我每次都觉得脏。

【讨论】:

  • 最终,工程人员认为 grails 很糟糕,我们从一开始就讨厌使用它。我们已经继续前进,但不是在对选择堆栈的原始开发人员施加 100 年诅咒之前。
【解决方案3】:

我最近也遇到过这种情况。事实证明,我们有一段代码将 Long 传递给 StringUtils.isNotEmpty()。对该方法的每个后续调用都具有 null 的 String 值,并出现相同的 MissingMethodException 错误。

您可以通过执行非常轻松地复制它...

        String string = null
        Long longVal = new Long("1103384")

        try{
                StringUtils.isNotEmpty(longVal)
            }catch(Exception e){
                e.printStackTrace()
            }
        try{
            if(!StringUtils.isNotEmpty(string)){
                println("............EMPTY. Good.")
            }
        }catch(Exception e){
            e.printStackTrace()
        }

在上面的两个调用中都出现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多