gpt4 book ai didi

grails - Groovy 混合?

转载 作者:行者123 更新时间:2023-12-04 02:40:24 26 4
gpt4 key购买 nike

我正在尝试在我的 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com