过滤DataSet时“AST not available”异常

时间:2013-08-13 05:17:46

标签: groovy groovy-sql

我有以下常规程序 -

def people = sql.dataSet('players')
def d = people.findAll { true }
print d.rows()

我在print语句中得到一个例外。

groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: in.kshitiz.pgnimport.dao.PlayerDao$_get_closure1. Is the source code on the classpath?
    at groovy.sql.DataSet.visit(DataSet.java:300)
    at groovy.sql.DataSet.getSqlWhereVisitor(DataSet.java:283)
    at groovy.sql.DataSet.getSqlWhere(DataSet.java:230)
    at groovy.sql.DataSet.getSql(DataSet.java:257)
    at groovy.sql.DataSet.rows(DataSet.java:332)
    at groovy.sql.DataSet$rows.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
    at in.kshitiz.pgnimport.dao.PlayerDao.get(PlayerDao.groovy:13)
    at in.kshitiz.pgnimport.dao.PlayerDao$get.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at in.kshitiz.pgnimport.dao.PlayerDaoTest.testGet(PlayerDaoTest.groovy:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

例外不是很有帮助。这是什么意思?

1 个答案:

答案 0 :(得分:3)

只需将groovy DAO源添加到类路径即可解决问题。

this邮件列表中,Guillaume Laforge说:

  

Sql类的使用有一些转折。

     

它需要您的Groovy类源代码 - 比如运行groovy myScript.groovy时。

     

因此,例如,当一个类被预编译时,“类节点”将不再可用,因为它没有存储在字节码中。

     

这可能是你在这里遇到的问题。

     

findall {}部分需要类节点,我们正在访问AST以创建特殊查询。

来自Groovy in Action(第10章,第343页,第4段) -

  

DataSet实现获取Groovy的内部表示   闭包的代码。这个内部表示称为   抽象语法树(AST)由Groovy解析器生成。   通过遍历AST(带有访问者模式),DataSet   实现发出每个AST节点的SQL等价物。