域类中的MissingMethod异常

时间:2010-11-11 16:04:35

标签: grails

每次我重新启动应用程序时,我都会对Grails域类的动态方法有一个MissingMethodException。

我有3个班级:

Manager.groovy:该类包含一个Java ScheduledThreadPoolExecutor和一个创建Worker的init方法,并将这些Worker提交给执行者。

Worker.groovy:实现Runnable并调用Domain动态方法。例如:MyDomain.get()

Bootstrap.groovy:在init方法中我调用了manager.init()

有时工人在域上调用动态方法,我得到了MissingMethodException。

知道怎么解决吗?

谢谢

1 个答案:

答案 0 :(得分:1)

让你的Worker课程extend Thread(或者让new Thread(Runnable)装饰它)并将Groovy ContextClassLoader传递给它:

Worker worker = new Worker() // extends Thread
worker.setContextClassLoader(
    Thread.currentThread().getContextClassLoader())
manager.schedule(worker, ..)

Thread worker = new Thread(new Worker())
worker.setContextClassLoader(
    Thread.currentThread().getContextClassLoader())
manager.schedule(worker, ..)

原因:Groovy类加载器已经加载了与运行时元编程相关的特殊Groovy类,比如关联元类和调用虚方法。你的ThreadPoolExecutor可能会使用另一个不知道Groovy“魔法”的新鲜的类加载器。