Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails,将固定标准与动态标准列表相结合_Grails_Gorm_Criteria - Fatal编程技术网

Grails,将固定标准与动态标准列表相结合

Grails,将固定标准与动态标准列表相结合,grails,gorm,criteria,Grails,Gorm,Criteria,我正在做一个过滤一些日志消息的应用程序。日志消息属于属于某个位置的主机。控制器允许按文本、主机和其他一些参数进行过滤,我需要向条件中添加一些动态生成的闭包。通过一些代码,这将得到澄清;我在Config.groovy中有这个闭包,这个闭包不是固定的,它应该是一个外部文件,在更改时动态重新加载,并由管理员编辑: pruebaclos = { host { location { ilike("slug", "%grs%") } }

我正在做一个过滤一些日志消息的应用程序。日志消息属于属于某个位置的主机。控制器允许按文本、主机和其他一些参数进行过滤,我需要向条件中添加一些动态生成的闭包。通过一些代码,这将得到澄清;我在Config.groovy中有这个闭包,这个闭包不是固定的,它应该是一个外部文件,在更改时动态重新加载,并由管理员编辑:

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%")
      }
    }
  }
}