如何使用域类字符串名称访问用户定义的 Grails 项目包名称

Posted

技术标签:

【中文标题】如何使用域类字符串名称访问用户定义的 Grails 项目包名称【英文标题】:How to access a user defined Grails Project Package Name using the domain class string name 【发布时间】:2013-06-07 17:49:54 【问题描述】:

我们正在尝试创建一个具有多个包名称的 grails 应用程序。每个包名称将代表不同的业务实体和功能。

实际上,一个 grails 应用程序项目中有多个 grails 应用程序,每个应用程序都由自己的包表示。

然后,我们希望根据包名称为表添加唯一前缀,而不必为域类名称添加前缀或在每个域类上使用静态映射。 DefaultNamingStrategy 可以很好地处理项目中每个域类的表前缀。

我遇到的问题是访问classToTableName 方法中调用的每个域类名称字符串的项目包名称。对于传递给classToTableName 方法的每个域类字符串,我需要用户定义的项目包名称来区分应根据包名称在表上分配的唯一前缀。

为了使用getArtefactsGroovyClassLoader 访问项目包名称,我尝试了几种不同的方法,但输出是java.lang 或grails.commons 包。

我们将不胜感激任何可以提供的帮助。下面的CustomNamingStrategy 类已在项目的groovy 文件夹中创建,并在DataSource.groovy 文件的hibernate 部分中引用。

class CustomNamingStrategy extends DefaultNamingStrategy 
    String classToTableName( String className ) 
        def packageName
        def prefix = ""

        // How do I access the package name of the domain class using className string?

        if (packageName == 'recordretention')
            prefix = "Rr"
        
        className = prefix + className

        covertFromCamelCase(super.classToTableName(className))
    

    String covertFromCamelCase(String input) 
        GrailsNameUtils.getNaturalName(input).replaceAll("\\s", "_").toUpperCase();
    

【问题讨论】:

【参考方案1】:

经过大量搜索,正是 grails 2.x 中的 Holders 类提供了 src/groovy 文件夹中的类所需的访问权限。

Class clazz = Holders.grailsApplication.domainClasses.find  it.clazz.simpleName == className .clazz

packageName = clazz.getPackage().getName()

【讨论】:

【参考方案2】:

未经测试,但假设您的“子应用程序”之间的类名不同,您也许可以使用 grailsapplication 查找方法(未经测试 getartefactbylogicalpropertyname)http://grails.org/doc/latest/api/org/codehaus/groovy/grails/commons/GrailsApplication.html#getArtefactByLogicalPropertyName(java.lang.String,%20java.lang.String)

您可以通过 applicationholder 查找 grailsapplication。

【讨论】:

当我使用 grailsApplication 时,我收到以下信息:没有这样的属性:grailsApplication 类:custom.CustomNamingStrategy。这是否与此有关:此接口的实现者应该知道 GrailsApplication 仅在调用 initialise() 方法时才被初始化。换句话说,GrailsApplication 实例是由 Grails 运行时延迟初始化的。 请阅读我回答的最后一句话。预计 grailsApplication 不是该类的属性,您需要使用已弃用的 ApplicationHolder 实用程序类 (grails.org/doc/latest/api/org/codehaus/groovy/grails/commons/…) 或其他非弃用方式“查找” grailsApplication。

以上是关于如何使用域类字符串名称访问用户定义的 Grails 项目包名称的主要内容,如果未能解决你的问题,请参考以下文章

Grails:按名称查找域类

如何修复 Grails 错误:“找不到名称 PrivacyOptions 的域类。请重试并输入有效的域类名称”

在 Grails 中,如何访问域类静态方法中的休眠会话?

Grails 多列索引

grails 和 spring security acl:仅显示域类的一些实例

如何将 Grails 域类映射到 DTO?