在Grails中使用java类

时间:2009-05-04 16:47:34

标签: groovy grails

我有一个Java \ Spring \ Hibernate应用程序 - 完整的域类基本上是Hibernate POJO

我认为有一些功能可以在Grails中很好地编写。

我希望重用我在主Java应用程序中创建的域类

最好的方法是什么?

我应该编写扩展Java类的新域类吗?这听起来很俗气 或者我可以从Java域类生成'控制器吗?

在Grails \ Groovy中重用Java域对象的最佳做法是什么? 我确信必须有其他人用grails \ groovy写一些文章

如果你知道一个关于这种集成的教程,那将是非常棒的!

PS:我是Grails-groovy的新手,所以可能会错过这个显而易见的事。谢谢!!!

3 个答案:

答案 0 :(得分:19)

了解Groovy和Grails在与现有Java代码集成方面的表现如何,我认为我可能比迈克尔对您的选择更加乐观。

首先,您已经在使用Spring和Hibernate,并且由于您的域类已经是POJO,因此它们应该易于集成。您可能拥有的任何Spring bean都可以照常在(grails-app/conf/spring/resources.xml)中在XML文件中指定,或者更简单地使用Grails的Spring bean builder功能。然后可以在任何控制器,视图,服务等中按名称访问它们,并照常使用。

我认为,以下是集成域类和数据库架构的选项:

  • 绕过GORM并加载/保存您的域对象,就像您现在一样。

    Grails不会强迫您使用GORM,因此这应该非常简单:创建.jar Java代码(如果尚未创建)并将其放入Grails应用程序{{1} } 目录。如果您的Java项目是Mavenized,那就更容易了:Grails 1.1适用于Maven,因此您可以为Grails应用程序创建lib并将Java项目添加为依赖项,就像在任何其他(Java)项目中一样。

    无论哪种方式,您都可以pom.xml您的课程(以及任何支持课程)并照常进行。由于Groovy与Java的紧密集成,您将能够创建对象,从数据库加载它们,修改它们,保存它们,验证它们等,就像在Java项目中一样。你不会以这种方式获得GORM的所有便利,但是你可以以对你有意义的方式使用你的对象(除了Groovy可能会少一点代码)。您可以随时尝试此选项以使某些工作有效,然后在其他时候考虑其中一个选项,如果它在那时似乎有意义的话。

    如果您尝试此选项,请提示一下:将实际的持久性代码抽象为Grails服务(也许是import)并让控制器在其上调用方法,而不是直接处理持久性。这样,如果需要,您可以使用其他方式替换该服务,只要您维护相同的界面,您的控制器就不会受到影响。

  • 创建新的Grails域类作为现有Java类的子类。

    如果您的类已经被编写为正确的bean,即使用所有属性的getter / setter方法,这可能非常简单。 Grails将看到这些继承的属性,如果它们是用更简单的Groovy样式编写的。您将能够指定如何验证每个属性,使用简单的验证检查(非空,不是空白等)或使用执行更复杂操作的闭包,可能在其POJO超类中调用现有方法。

    您几乎肯定需要通过GORM mapping DSL调整映射以适应现有数据库模式的实际情况。关系可能会变得棘手。例如,您可能有一些其他解决方案,其中GORM需要一个连接表,尽管甚至可能有办法解决这些差异。我建议尽可能多地学习GORM及其映射DSL,然后尝试一些类,看看这是否可行。

  • 让Grails直接使用您现有的POJO和Hibernate映射。

    我自己没有尝试过,但根据Grails的Hibernate Integration page,这应该是可能的:“Grails还允许您用Java编写域模型或重用现有的域模型使用Hibernate进行映射。您所要做的就是将必要的'hibernate.cfg.xml'文件和相应的映射文件放在'%PROJECT_HOME%/ grails-app / conf / hibernate'目录中。您仍然可以调用所有GORM允许的动态持久性和查询方法!“

    谷歌搜索“gorm遗产”引发了许多有用的讨论和例子,例如Glen Smith的this blog post(即将发布的 Grails in Action )他显示了一个Hibernate映射文件,用于与“来自地狱的遗留数据库”集成。 Grails in Action 有一个标题为“Advanced GORM Kungfu”的章节,承诺对该主题进行详细讨论。我有这本书的预发布PDF,虽然我还没有完成那一章,但到目前为止我所读到的内容非常好,这本书涵盖了许多其他Grails书中未充分讨论的主题。

对不起,我不能提供关于这最后一个选项的任何个人经验,但它确实听起来可行(并且非常有希望)。无论您选择哪种方式,请告诉我们结果如何!

答案 1 :(得分:4)

你真的想要/需要使用Grails而不仅仅是Groovy吗?

Grails确实不是您可以用来向现有Web应用添加部件的东西。整个“约定优于配置”方法意味着您几乎必须遵循Grails的规则,否则使用它没有意义。其中一个规则是域对象是Grails运行时大大“增强”的Groovy类。

有可能让他们扩展现有的Java类,但我不打赌它 - 现有应用程序的所有Spring和Hibernate部分都必须被丢弃,或者至少你不得不花钱为了让它们在Grails中工作付出了很多努力。你将与​​框架作斗争,而不是从中获利。

IMO你有两个选择:

  • 在Grails中重写您的应用程序,同时尽可能多地重用现有代码。
  • 保持您的应用不变,并在Groovy中添加新内容,而不使用Grails。

后者可能在你的情况下更好。 Grails旨在快速创建新的Web应用程序,这就是它的亮点。将内容添加到现有应用程序并不是它的用途。

修改 关于评论中的澄清:如果您计划基本上为另一个应用程序使用的数据编写数据输入/维护前端,并将DB作为它们之间唯一的通信通道,那么Grails可能实际上可以很好地工作;它当然可以配置为使用现有的数据库模式,而不是从域类创建自己的模式(尽管后者的工作量较少)。

答案 2 :(得分:3)

这篇文章提供了一些使用grails for wrapping existing Java classes in a web framework的建议。