2014-09-03 49 views
0

我正在做一個應用程序來過濾一些日誌消息。日誌消息屬於屬於某個位置的主機。控制器允許按文本,主機和其他一些參數進行過濾,並且我需要爲條件添加一些動態生成的閉包。用一些代碼,這將被澄清;我有這樣的Config.groovy中(這閉合不是固定的,這應該是改變時外部文件動態重新加載的,和可編輯由管理員):Grails將固定標準與動態動態列表結合起來

pruebaclos = { 
    host { 
     location { 
      ilike("slug", "%grs%") 
     } 
    } 
} 

然後,在控制器中,我有這樣的:

// Hosts 
List<Host> hosts = [] 
params.list("host_id")?.each { String hostIdStr -> 
    if (hostIdStr.isLong()) { 
     Long hostId = hostIdStr.toLong() 
     Host host = Host.get(hostId) 
     if (host) { 
      hosts << host 
     } 
     else { 
      // Not found 
     } 
    } 
    else { 
     // Id not valid 
    } 
} 


// generated externally.... 
def additionalFilters = [] 
additionalFilters << grailsApplication.config.pruebaclos 

def results = HostLogMessage.createCriteria().list (max: params.long("max"), offset: params.long("offset")) { 

    and { 

     if (hosts) { 
      or { 
       hosts.each { Host currentHost -> 
        eq("host", currentHost) 
       } 
      } 
     } 

     if (params.user) { 
      ilike("user", "%${ params.user }%") 
     } 
     if (params.facility) { 
      ilike("facility", "%${ params.facility }%") 
     } 
     if (params.severity) { 
      ilike("severity", "%${ params.severity }%") 
     } 
     if (params.message) { 
      ilike("message", "%${ params.message }%") 
     } 
    } 

    or { 
     additionalFilters.each { 
      it.delegate = delegate 
      it() 
     } 
    } 

} 

但我得到這個錯誤:

could not resolve property: slug of: XXXXXX.HostLogMessage 

如果我把同封在控制器本身,我沒有得到任何錯誤,應用封閉:

def myClos = { 
    host { 
     location { 
      ilike("slug", "%cabu%") 
     } 
    } 
} 

def additionalFilters = [] 
additionalFilters << myClos 

任何想法,如果我把錯誤,如果我把配置文件中的封閉?

這些都與主要的域類(垃圾刪除):我想我知道抓什麼.. 如果定義在Config.groovy封閉

class Location { 
    def configurationService 
    static hasMany = [ 
     hosts: Host 
    ] 
    Location parent 
    String slug 
    String name 
} 

class Host { 
    static hasMany = [ messages: HostLogMessage ] 
    Location location 
    String name 
} 

class HostLogMessage { 
    static belongsTo = [ host: Host ] 
    DateTime dateTime 
    String user 
    String facility 
    String severity 
    String message 
} 
+0

做'additionalFilters'和的元素'delegate'有什麼課? – injecteer 2014-09-03 11:30:42

+0

additionalFilters是應該添加到條件中的閉包列表。我不知道到底是什麼「委託」,我已經看到在很多使用重複使用閉包標準的例子中...... – okelet 2014-09-03 12:27:08

+0

do'additionalFilters.each {it.delegate = delegate println'$ it - > $ delegate 「 它() }' – injecteer 2014-09-03 12:33:38

回答

0

,它就會被config-builder和處理在途中正在改變。

爲了避免它,你應該明確地定義關閉:

def closure = {-> 
    host { 
    location { 
     ilike("slug", "%grs%") 
    } 
    } 
} 

pruebaclos = closure 

或列表:

pruebaclos = [ 
    {-> 
    host { 
     location { 
     ilike("slug", "%grs%") 
     } 
    } 
    }, 

    {-> 
    // 
    } 
] 

UPDATE:

看起來像你的嵌套關閉的標準方向是錯誤的,並且缺少1個內部封閉。

代替:

def closure = {-> 
    host { 
    location { 
     ilike("slug", "%grs%") 
    } 
    } 
} 

應該是周圍的其他方法+ messages塊:

def closure = {-> 
    location { 
    host { 
     messages{ 
     ilike("slug", "%grs%") 
     } 
    } 
    } 
} 
+0

嗨injecteer,非常感謝你,但這不起作用......我得到同樣的錯誤。 – okelet 2014-09-04 07:11:14

+0

發佈您的域名類(並省略非必要的細節) – injecteer 2014-09-04 09:50:29

+0

發佈更新,謝謝injecteer – okelet 2014-09-04 10:33:21