【问题标题】:How to access a user defined Grails Project Package Name using the domain class string name如何使用域类字符串名称访问用户定义的 Grails 项目包名称
【发布时间】: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();
    }
}

【问题讨论】:

    标签: grails groovy grails-domain-class


    【解决方案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。
      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多