如何在jar中使用@ grails.persistence.Entity注释的类

时间:2013-04-11 06:30:12

标签: grails grails-domain-class

在我的grails项目中,我想使用@ grails.persistence.Entity注释在公共jar文件中使用域类。但是当我按照doc from grails site

中的步骤进行操作时

我添加喜欢

的hi​​bernate.cfg.xml
<!DOCTYPE hibernate-configuration SYSTEM
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <mapping package="com.books" />
        <mapping class="com.books.Book" />
    </session-factory>
</hibernate-configuration>

到grails-app / conf / hibernate /目录。 但是当我启动项目时,它会报告错误日志:

2013-04-11 14:24:53,928 - org.codehaus.groovy.grails.web.context.GrailsContextLoader -20516 [pool-5-thread-1] ERROR  - Error executing bootstraps: groovy.lang.MissingMethodException: No signature of method: static com.baoxian.task.inscar.entity.QuoteTask.findById() is applicable for argument types: (java.lang.Long) values: [2851]
Possible solutions: find(), findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure)
org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: static com.baoxian.task.inscar.entity.QuoteTask.findById() is applicable for argument types: (java.lang.Long) values: [2851]
Possible solutions: find(), findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure)
    at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:300)
    at grails.util.Environment.executeForEnvironment(Environment.java:293)
    at grails.util.Environment.executeForCurrentEnvironment(Environment.java:269)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: groovy.lang.MissingMethodException: No signature of method: static com.baoxian.task.inscar.entity.QuoteTask.findById() is applicable for argument types: (java.lang.Long) values: [2851]
Possible solutions: find(), findAll(), findAll(groovy.lang.Closure), find(groovy.lang.Closure)
    at BootStrap$_closure1.doCall(BootStrap.groovy:22)
    ... 8 more
Disconnected from the target VM, address: '127.0.0.1:63383', transport: 'socket'

Process finished with exit code 1

很明显@Entity不起作用。 此外,我的BuildConfig.groovy喜欢:

compile ('com.baoxian:baoxian-task-inscar-manager:1.2.5-SNAPSHOT')
                {
                    excludes "org.grails", "org.slf4j", "xml-apis","mysql","org.hibernate","hsqldb","hibernate-annotations","org.quartz-scheduler","org.springframework"
                }
com.baoxian:baoxian-task-inscar-manager:1.2.5-SNAPSHOT就是我的域名来自

这是我第一次在stackoverflow上提问。 ^ _ ^

1 个答案:

答案 0 :(得分:1)

如果我错过了一个更简单/更好的问题解决方案,请有人纠正我。

@ yidao620c,我担心你所做的事情不会奏效......

我推荐2个解决方案(对于您似乎想要做的事情,我通常选择第二个选项):

1) JPA实体注释不是Grails实体注释

如果你想关注文档,我相信你的JPA类必须驻留在Grails项目中(JPA注释,而不是grails @Entity 注释)。

最简单的路径可能是JPA插件http://grails.org/JPA+Plugin。如果您仍然需要动态查找器,请跳转到选项2)。

2) Gorm ouside Grails注入动态查找器

如果你想从外部jar(非Grails项目)导入 grails带注释的实体,你需要一些额外的步骤来注入动态查找器( findAll ,等)。

由于它可能是一篇包含所有细节的长篇文章,我将很快创建一个关于如何操作的视频(提示:http://www.grails.org/GORM+-+StandAlone+Gorm)。

但是,这是一个简短的回答:

  • 创建一个Groovy项目(我通常使用Gradle作为构建系统)。
  • 依赖于Grails Gorm,Grails bootstrap和少数 其他人(slf4j,春天等)
  • 使用Spring配置(XML或Grails Spring DSL)注入Gorm Session工厂。您可以使用简单的主类快速测试动态查找器 - &gt;加载Spring Beans来设置Gorm - &gt;使用 withNewSession withTransaction 或使用服务调用域对象。
  • 当您构建jar时,编译阶段将增强您的实体以注入动态Gorm方法。