groovy - 在 Grails 中使用 Java 类

标签 groovy grails

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

我认为有一个功能可以用 Grails 很好地编写。

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

这样做的最佳方法是什么?

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

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

如果你知道一个关于这种集成的教程——那就太棒了!!!

PS:我是 grails-groovy 的新手,所以可能会遗漏明显的内容。谢谢 !!!

最佳答案

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

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

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

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

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

    无论哪种方式,您都可以import您的类(class)(和任何支持类(class))并照常进行。由于 Groovy 与 Java 的紧密集成,您将能够创建对象、从数据库加载它们、修改它们、保存它们、验证它们等等,就像您在 Java 项目中所做的那样。您不会以这种方式获得 GORM 的所有便利,但是您将拥有以一种对您有意义的方式处理您的对象的优势(除了由于 Groovy 可能使用更少的代码)。您始终可以先尝试使用此选项以使某些内容正常工作,然后如果当时看起来有意义,则稍后再考虑其他选项之一。

    如果您确实尝试此选项,则有一个提示:将实际的持久性代码抽象为 Grails 服务(可能是 StorageService),并让您的 Controller 在其上调用方法,而不是直接处理持久性。通过这种方式,您可以在需要时用其他东西替换该服务,只要您保持相同的界面,您的 Controller 就不会受到影响。
  • 创建新的 Grails 域类作为现有 Java 类的子类。

    如果您的类已经被编写为合适的 bean,即所有属性都使用 getter/setter 方法,那么这可能非常简单。 Grails 会看到这些继承的属性,就像它们以更简单的 Groovy 风格编写一样。您将能够指定如何验证每个属性,使用简单的验证检查(非空、非空等)或使用执行更复杂事情的闭包,也许调用其 POJO 父类(super class)中的现有方法。

    您几乎肯定需要通过 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 legacy”会出现许多有用的讨论和示例,例如 this blog post作者 Glen Smith(即将发布的 Grails in Action 的合著者)在其中展示了一个 Hibernate 映射文件,用于与“来自 hell 的遗留数据库”集成。 Grails in Action 有一章标题为“Advanced GORM Kungfu”,其中 promise 详细讨论这个主题。我有这本书的预发行 PDF,虽然我还没有读到那一章,但到目前为止我读过的内容非常好,而且这本书涵盖了许多在其他 Grails 书籍中没有充分讨论的主题.

  • 抱歉,我无法提供有关最后一个选项的任何个人经验,但听起来确实可行(而且很有希望)。无论您选择哪个选项,请告诉我们结果如何!

    关于groovy - 在 Grails 中使用 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/820887/

    相关文章:

    groovy - 如何从groovy中的 map 中获取最后一个KEY?

    grails - 从迁移中更新字段

    grails - 在grails中请求变量

    list - Grails:UPDATE函数如何工作?

    spring - 如何转换grails 2 LDAP Active Directory值以使用Spring Boot

    servlets - 无法下载小文件,但可以下载大文件

    grails 将 gorm 子查询动态添加到现有查询中

    grails - 用户在Grails中取消了文件下载

    linux - 有什么方法可以自动调用网络服务吗?

    jenkins - 如何在 Jenkins Job DSL 插件的上下文中使用共享/通用 groovy 方法