我們試圖做的是創建一個具有多個包名的grails應用程序。每個軟件包名稱將代表不同的業務實體和功能。如何使用域類字符串名稱訪問用戶定義的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();
}
}
當我使用grailsApplication時,我收到以下內容:No such property:grailsApplication for class:custom.CustomNamingStrategy。這是否與此有關:這個接口的實現者應該意識到GrailsApplication只在調用initialise()方法時被初始化。換句話說,GrailsApplication實例是由Grails運行時延遲初始化的。 – nateg
請閱讀我答案的最後一句。預計grailsApplication不是該類的屬性,您需要使用已過時的ApplicationHolder實用程序類「查找」grailsApplication(http://grails.org/doc/latest/api/org/codehaus/groovy/grails/commons /ApplicationHolder.html#getApplication())或其他未棄用的方式。 – rimero