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

时间:2013-06-11 18:50:01

标签: grails groovy grails-domain-class

我们要做的是创建一个包含多个包名称的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();
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

packageName = clazz.getPackage().getName()

答案 1 :(得分:0)

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

您可以通过应用程序持有者查找grailsapplication。