2012-07-13 86 views
1

我工作的一些動態過濾,並且有這樣的:

class Filterable { 
    def statusId 
    def secondaryFilterable 
} 
... 
def filter = new Filter(validIds: [1], fieldName: 'statusId') 
... 
class Filter { 

    def validIds = [] as Set 
    def fieldName 
    private boolean containsFieldValue(input) { 
     def fieldValue = input."${fieldName}" 
     return fieldValue in validIds 
    } 
} 

這只是正常的一個屬性。不過,現在我需要通過二級過濾過濾 - 像

def filter = new Filter(validIds: [1], fieldName: 'secondaryFilterable.statusId') 

會拋出一個groovy.lang.MissingPropertyException。有什麼建議?

+0

可能的重複http://stackoverflow.com/q/4077168/581845 – epidemian 2012-07-13 14:35:57

回答

2

引用的屬性假定點是屬性名稱的一部分。

一個簡單的解決辦法是:

... 
def fieldValue = fieldName.split(/\./).inject(input){ parent, property -> parent?."$property" } 
... 

這將遞歸查詢使用點符號爲子屬性的字段值。

I put up a working example here在Groovy Web控制檯上。

+0

注意:此示例不檢查屬性的有效性 - 如果該屬性不存在,則可能會引發錯誤。 (在示例鏈接中嘗試''foo.bar.badValue'')如果需要,可以通過使用['hasProperty'](http://groovy.codehaus.org/Evaluating+the+MetaClass) +運行時)。 – OverZealous 2012-07-13 10:22:25