【问题标题】:Grails withForm causing errorGrails withForm 导致错误
【发布时间】:2014-11-02 23:42:43
【问题描述】:

我在使用下面的代码时遇到了问题。添加 invalidToken 处理程序时出现错误。我正在使用 grails V 2.3.4

 withForm {
       // ready to go
    }.invalidToken {
       // bad submit
    }

blaaaa/blaaa/controller.groovy: 123: [静态类型检查] - 不能 查找匹配方法 java.lang.Object#invalidToken(groovy.lang.Closure)。请检查是否 声明的类型是正确的,如果方法存在。 @ 第 123 行, 第 9 栏。 withForm { ^

【问题讨论】:

  • 您将需要包含更多控制器代码,以便我们帮助您识别问题。仅此 sn-p 就缺少它在其中使用的方法的详细信息,或者您的控制器可能正在扩展的类等等。
  • 你在使用@CompileStatic吗?如果你不这样做,它会起作用吗?
  • 是的,该文件正在使用 CompileStatic。如果我删除它,它会起作用。我没有在控制器中编写代码,因此不确定删除 CompileStatic 是否会导致其他问题。有没有办法将它与 CompileStatic 一起使用
  • @GrailsCompileStatic 的目的是提供类似于@CompileStatic 的静态类型检查,但要了解 Grails 并能够处理 @CompileStatic 不了解的 Grails 特定交互。如果您向jira.grails.org/browse/GRAILS 提出功能请求,我们可以改进@GrailsCompileStatic 以应对这种情况。
  • 实际上,即使使用@CompileStatic,我们也可以修复此问题。无论如何,提交 JIRA 将有助于影响必要的更改。

标签: grails


【解决方案1】:

如您所见,使用@CompileStatic 会导致动态代码失败,因此您需要返工一些代码以使其兼容。然而,Grails 中有很多功能与@CompileStatic 不兼容,因为它是一个相对较新的功能;自从第一个使用 Groovy 2.0 的 2.2 版本以来,它只能在 Grails 中使用。

因此,您必须将 withForm 块重新设计为非动态的。我最近没有看过底层代码,但我猜你可以做到,但它会很丑,你会希望你没有。在有意义的地方使用@CompileStatic(并且在它产生影响的地方使用它;这段代码有和没有它的性能差异可能只有几毫秒)。

我没有与@CompileStatic 合作过,无法确定,但我非常有信心您可以随时删除注释并且代码可以正常工作;然后你会有多余的强制转换和非动态代码,但它仍然是完全有效的 Groovy。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多