2010-10-22 41 views
2

我正在編寫一個Groovy腳本(作爲Grails插件的一部分),我想獲取GrailsDomainClass的屬性列表,該列表是我的插件的用戶可能會定義。我可以使用domainClass.properties(其中domainClass是GrailsDomainClass)來執行此操作。通過GrailsDomainClassProperty區分Grails領域類字段和getBlah()方法

但是,假設用戶有Grails領域類:

class Example { 
    String name 

    static constraints = { 
    } 

    def getSomeNonExistingProperty(){ 
    return "Not-a-real-property" 
    } 
} 

在這種情況下,domainClass.properties返回既namesomeNoneExistingProperty

我明白,這是因爲Grails的是生成一個列表只讀屬性可以在某人擁有getBlah()方法的情況下使用。這很好,但在我的腳本中,我只想用「真實」屬性(或者至少是非只讀屬性)執行一些操作。

也就是說,我想要某種方式來區分或識別someNonExistingProperty作爲只讀屬性,或者作爲Grails生成的屬性,而不是由我的插件的用戶在domainClass中作爲字段明確輸入。

我看了一下GrailsDomainClassProperty類,它有一系列的方法提供有關屬性的信息。然而,他們都沒有告訴我某個屬性是否是隻讀屬性,或者是讓我區分domainClass中定義的字段和Grails由於「getSomeNonExistingProperty」動態創建的字段()「 方法。

我在這裏錯過了一些明顯的東西嗎?有沒有辦法獲得一個明確的用戶定義的字段列表(例如,在上面的例子中的名稱)?

回答

0

我碰到這個問題了幾次,而不是試圖解決它,我通常只落得重命名我getX()方法。這可能是最簡單的選擇。

編輯: 另外,我不知道你是否可以使用反射來看看哪些方法是在類中定義,並在遍歷你的屬性看,如果酒店有定義明確的吸氣劑,而忽略它。我對Groovy和Grails的反思並不是很熟悉,尤其是對於動態方法,但這是一條可能的調查路線。

+0

重命名getX()方法是可行的,只是這是一個插件,所以它不是(一般情況下)我的代碼腳本正在採取行動 - 我不想堅持使用插件的任何人都需要避免getX()方法。使用反射的想法值得跟進,謝謝。我會看看是否有幫助 - 但是我很可疑,因爲那樣會出現相反的問題,即不排除「真實​​」屬性,但確實有一個與它們關聯的getX()方法。 – Glennn 2010-10-25 06:55:03

1

相信瞬態特性是你想怎麼排除

+0

謝謝 - 但如果是這種情況,我仍然錯過了一些東西,我想。如果我有p,對應於getSomeNonExistingProperty()方法即時生成的屬性,則p.name例如返回字符串「someNonExistingProperty」,p.isPersistent()返回「true」並且p.TRANSIENT返回字符串「瞬變」。這些值與其他「真實」屬性(名稱)返回的值相同,但p.name =「name」除外。我錯過了什麼? – Glennn 2010-10-22 01:49:33