Grails,将固定标准与动态标准列表相结合
我正在做一个过滤一些日志消息的应用程序。日志消息属于属于某个位置的主机。控制器允许按文本、主机和其他一些参数进行过滤,我需要向条件中添加一些动态生成的闭包。通过一些代码,这将得到澄清;我在Config.groovy中有这个闭包,这个闭包不是固定的,它应该是一个外部文件,在更改时动态重新加载,并由管理员编辑:Grails,将固定标准与动态标准列表相结合,grails,gorm,criteria,Grails,Gorm,Criteria,我正在做一个过滤一些日志消息的应用程序。日志消息属于属于某个位置的主机。控制器允许按文本、主机和其他一些参数进行过滤,我需要向条件中添加一些动态生成的闭包。通过一些代码,这将得到澄清;我在Config.groovy中有这个闭包,这个闭包不是固定的,它应该是一个外部文件,在更改时动态重新加载,并由管理员编辑: pruebaclos = { host { location { ilike("slug", "%grs%") } }
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()
}
}
}
如果我在控制器本身中放置相同的闭包,我不会得到任何错误,并且应用闭包:
def myClos = {
host {
location {
ilike("slug", "%cabu%")
}
}
}
def additionalFilters = []
additionalFilters << myClos
我想我知道要抓什么了。。 如果在Config.groovy中定义闭包,它将由配置生成器处理,并在途中进行转换 为了避免这种情况,您应该明确定义闭包:
def closure = {->
host {
location {
ilike("slug", "%grs%")
}
}
}
pruebaclos = closure
或作为列表:
pruebaclos = [
{->
host {
location {
ilike("slug", "%grs%")
}
}
},
{->
//
}
]
更新:
看起来条件中嵌套闭包的方向错误,缺少1个内部闭包
而不是:
def closure = {->
host {
location {
ilike("slug", "%grs%")
}
}
}
它应该是另一种方式围绕+消息块:
additionalFilters的元素和委托有什么类?additionalFilters是应该添加到条件中的闭包列表。我不知道“delegate”到底是什么,我在很多例子中看到,使用重用的闭包作为标准…做额外的过滤器。每个{it.delegate=delegate println$it->$delegate it}我认为没有太多信息。。。Config$\u run\u closure5->com.github.okelet.mortero.grails.controller.LogController$\u index\u closure2\u closure5Hi injecteer,非常感谢您,但这不起作用。。。我收到了相同的错误。发布您的域类和ommit非必需的详细信息pe,它不起作用它抛出相同的错误无法解析属性:slug of:xxxxx.HostLogMessage,可能我没有很好地解释。。。我将闭包应用于HostLogMessage的条件,因此在闭包中,我必须指定消息主机位置的slug,条件本身必须包含文本grs。在自己的控制器中定义的相同条件可以正常工作,因此它必须与配置文件相关。
pruebaclos = [
{->
host {
location {
ilike("slug", "%grs%")
}
}
},
{->
//
}
]
def closure = {->
host {
location {
ilike("slug", "%grs%")
}
}
}
def closure = {->
location {
host {
messages{
ilike("slug", "%grs%")
}
}
}
}