Groovy 在Grails中使用java类

Groovy 在Grails中使用java类,groovy,grails,Groovy,Grails,我有一个Java\Spring\Hibernate应用程序,包括基本上是Hibernate POJO的域类 我认为有一项功能可以在Grails中很好地编写 我希望重用我在主Java应用程序中创建的域类 最好的方法是什么 我应该编写扩展Java类的新域类吗?这听起来很俗气 或者我可以从Java域类“生成”控制器吗 在Grails\Groovy中重用Java域对象的最佳实践是什么 我确信一定有其他人在grails\groovy中写了一些文章 如果你知道一个关于这种集成的教程,那将是非常棒的 PS:我

我有一个Java\Spring\Hibernate应用程序,包括基本上是Hibernate POJO的域类

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

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

最好的方法是什么

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

在Grails\Groovy中重用Java域对象的最佳实践是什么 我确信一定有其他人在grails\groovy中写了一些文章

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


PS:我是GrailsGroovy的新手,所以可能没有注意到明显的问题。谢谢

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

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

也许可以让它们扩展现有的Java类,但我不敢打赌——现有应用程序的所有Spring和Hibernate部分都将被丢弃,或者至少你必须花费大量精力使它们在Grails中工作。您将与框架作斗争,而不是从中获益

在我看来,你有两个选择:

  • 在Grails中从头开始重写应用程序,同时尽可能重用现有代码
  • 保持应用程序的原样,在Groovy中添加新内容,而不使用Grails
后者可能更适合你的情况。Grails旨在非常快速地创建新的web应用程序,这就是它的亮点所在。向现有应用程序添加内容并不是它的目的

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

这篇文章提供了一些使用grails for的建议。

了解Groovy和grails在与现有Java代码集成方面有多出色,我想我可能比Michael对您的选择更乐观一些

首先,您已经在使用Spring和Hibernate,而且由于您的域类已经是POJO,它们应该很容易集成。您可能拥有的任何Springbean都可以像往常一样在XML文件中指定(在
grails app/conf/Spring/resources.XML中),或者更简单地使用grails的特性。然后可以在任何控制器、视图、服务等中按名称访问它们,并像往常一样使用它们

在我看来,以下是用于集成域类和数据库架构的选项:

  • 绕过GORM,完全按照您已经做的方式加载/保存域对象

    Grails不会强制您使用GORM,因此这应该非常简单:创建Java代码的
    .jar
    (如果您还没有),并将其放入Grails应用程序的
    lib
    目录。如果您的Java项目是Mavenized的,那就更容易了:Grails1.1与Maven一起工作,因此您可以为Grails应用程序创建
    pom.xml
    ,并像在任何其他(Java)项目中一样将Java项目添加为依赖项

    无论哪种方式,您都可以导入您的类(以及任何支持类),并照常进行。由于Groovy与Java的紧密集成,您将能够像在Java项目中一样创建对象、从数据库加载对象、修改对象、保存对象、验证对象等。通过这种方式,您不会获得GORM的所有便利,但您将拥有以一种对您来说已经有意义的方式处理对象的优势(除了可能由于Groovy而使用更少的代码)。你可以先尝试一下这个选项,然后再考虑其他选项,如果那个时候看起来有意义的话。 如果您尝试此选项,有一个提示:将实际的持久性代码抽象到Grails服务中(
    StorageService
    也许),并让您的控制器对其调用方法,而不是直接处理持久性。这样,如果需要的话,您可以用其他服务替换该服务,并且只要您保持相同的接口,您的控制器就不会受到影响

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

    如果您的类已经作为适当的bean编写,也就是说,对于它们的所有属性都使用getter/setter方法,那么这可能非常简单。Grails将看到这些继承的属性,就像以更简单的Groovy风格编写这些属性一样。您将能够指定如何验证每个属性,可以使用简单的验证检查(非null、非空等),也可以使用执行更复杂操作的闭包,例如调用POJO超类中的现有方法

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

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

    <