grails - Groovy 混合?

标签 grails groovy mixins

我正在尝试在我的 Groovy/Grails 应用程序中混入一个类,我正在使用 the syntax defined in the docs ,但我不断收到错误消息。

我有一个如下所示的域类:

class Person {
  mixin(ImagesMixin)

  // ...
}

它编译得很好,但由于某种原因它不起作用。包含 ImagesMixin 的文件位于我的 /src/groovy/ 中目录。

我已经使用 Groovy 版本 1.5.7 和 1.6-RC1 尝试过它,但没有任何运气。有谁知道我做错了什么?

堆栈跟踪:
2008-12-30 17:58:25.258::WARN:  Failed startup of context org.mortbay.jetty.webapp.WebAppContext@562791{/FinalTransmission,/home/kuccello/Development/workspaces/lifeforce/FinalTransmission/web-app}
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError
    at java.security.AccessController.doPrivileged(Native Method)
    at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy:67)
    at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy)
    at Init_groovy$_run_closure6.doCall(Init_groovy:131)
    at RunApp_groovy$_run_closure2.doCall(RunApp_groovy:66)
    at RunApp_groovy$_run_closure2.doCall(RunApp_groovy)
    at RunApp_groovy$_run_closure1.doCall(RunApp_groovy:57)
    at RunApp_groovy$_run_closure1.doCall(RunApp_groovy)
    at gant.Gant.dispatch(Gant.groovy:271)
    at gant.Gant.this$2$dispatch(Gant.groovy)
    at gant.Gant.invokeMethod(Gant.groovy)
    at gant.Gant.processTargets(Gant.groovy:436)
    at gant.Gant.processArgs(Gant.groovy:372)
Caused by: java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at Episode.class$(Episode.groovy)
    at Episode.<clinit>(Episode.groovy)
    ... 13 more
Caused by: groovy.lang.MissingMethodException: No signature of method: static Person.mixin() is applicable for argument types: (java.lang.Class) values: {class ImagesMixin}
    at Broadcast.<clinit>(MyClass.groovy:17)
    ... 17 more
2008-12-30 17:58:25.259::WARN:  Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.ExceptionInInitializerError:
groovy.lang.MissingMethodException: No signature of method: Person.mixin() is applicable for argument types: (java.lang.Class) values: {class ImagesMixin}
    at Broadcast.<clinit>(Person.groovy:17)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at Episode.class$(BelongsToMyClass.groovy)
    at Episode.<clinit>(BelongsToMyClass.groovy)
    at java.security.AccessController.doPrivileged(Native Method)
    at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy:67)
    at RunApp_groovy$_run_closure2_closure7.doCall(RunApp_groovy)
    at Init_groovy$_run_closure6.doCall(Init_groovy:131)
    at RunApp_groovy$_run_closure2.doCall(RunApp_groovy:66)
    at RunApp_groovy$_run_closure2.doCall(RunApp_groovy)
    at RunApp_groovy$_run_closure1.doCall(RunApp_groovy:57)
    at RunApp_groovy$_run_closure1.doCall(RunApp_groovy)
    at gant.Gant.dispatch(Gant.groovy:271)
    at gant.Gant.this$2$dispatch(Gant.groovy)
    at gant.Gant.invokeMethod(Gant.groovy)
    at gant.Gant.processTargets(Gant.groovy:436)
    at gant.Gant.processArgs(Gant.groovy:372)
2008-12-30 17:58:25.271::INFO:  Started SelectChannelConnector@0.0.0.0:8080

最佳答案

从 Groovy 1.6 开始,您可以在编译时使用注释将 mixin 应用于类

@Mixin(ImagesMixin)
class Person {
}

或者你可以像这样在运行时应用 mixin:
def myMixin = ImagesMixin
Person.mixin myMixin

后一种方法更具动态性,因为可以在运行时确定要混合的类。有关 Groovy 混合的更多信息,请访问 here .

根据我的经验,域类的许多元编程根本行不通。我不完全知道为什么,但怀疑是因为这些类已经由 Grails 运行时进行了大量元编程。一般来说,我的方法是
  • 在 Groovy 控制台中的 POGO 上尝试元编程
  • 如果可行,请在 Grails 控制台中的非域类上尝试它
  • 如果可行,请在 Grails 控制台中的域类上尝试。如果它不起作用,那么一定是因为它是一个域类(而不是语法问题)。在这一点上,建议尝试寻找另一种实现目标的方法。如果这是不可能的,那么使用 Grails 邮件列表和/或 Stackoverflow 和/或 Grails 源代码的组合来尝试使元编程工作。
  • 关于grails - Groovy 混合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/425617/

    相关文章:

    date - Dateish 字符串的问题

    css - Bootstrap 变量在 rails 中不可用

    grails - 将登录用户添加到所有 GSP 页面的上下文中

    grails - 如何呈现自定义错误消息?

    jenkins - 运行我的 jenkinsfile 时找不到这样的字段 : field java. lang.String sinput 错误

    xml - 如何使用 groovy 脚本循环 XML 子节点

    maven - 仅当发布时才进行Gradle发布

    grails - Grails插件配置被应用覆盖

    grails - 在Grails子查询中使用逻辑(或)

    python - 使用 Mypy 键入 dict mixin 类