0

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

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

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

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

getArtefacts为了使用, 或访问项目包名,我尝试了几种不同的方法GroovyClassLoader,但输出是 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();
    }
}
4

2 回答 2

1

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

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

packageName = clazz.getPackage().getName()
于 2013-06-13T13:53:08.423 回答
0

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

您可以通过 applicationholder 查找 grailsapplication。

于 2013-06-11T23:13:58.843 回答