2012-07-13 61 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