从grails“after”过滤器访问重定向id

从grails“after”过滤器访问重定向id,grails,redirect,filter,Grails,Redirect,Filter,我有一个标准的grails 1.3.7脚手架控制器,保存闭包如下: def save = { // ... instantiate and save "instance" ... redirect(action: "show", id: instance.id) } 。。。和后过滤器,例如: def filters = { save(controller:'*', action:'save') {

我有一个标准的grails 1.3.7脚手架控制器,保存闭包如下:

    def save = {

        // ... instantiate and save "instance" ...

        redirect(action: "show", id: instance.id)
    }
。。。和后过滤器,例如:

        def filters = 
{
    save(controller:'*', action:'save')
    {
        after =
        {
            // How do I get the newly created entity's ID here?     
        }
    }
是否有一种方法可以在任何控制器的筛选器中访问新实体的ID,而不必向每个控制器添加任何额外/特殊代码?

您可以将其放入请求中,如

和过滤器一样

def id = request.getAttribute('CREATED_ID')
更新:

或者您也可以在beforeInsert事件或您自己的事件侦听器中将其放入请求中:

您可以将其放入请求中,如

和过滤器一样

def id = request.getAttribute('CREATED_ID')
更新:


或者在前面的插入事件中,或者在你自己的事件侦听器中请求它:

保存在由SPLIX推荐的请求中,或者考虑使用拦截器。在“afterInterceptor”中,您可以直接访问模型。看

更新 根据您的评论,您可以使用元编程技术并拦截对域类的每个“afterInsert”调用。例如,如果您在引导中添加了以下内容:

grailsApplication.domainClasses.each { org.codehaus.groovy.grails.commons.GrailsDomainClass gc ->
    gc.metaClass.afterInsert = {
        println "$id"
    }
}

您应该能够访问所有新创建的域对象并执行常用操作。

< P>将其保存在SPLIX推荐的请求中,或者考虑使用拦截器。在“afterInterceptor”中,您可以直接访问模型。看

更新 根据您的评论,您可以使用元编程技术并拦截对域类的每个“afterInsert”调用。例如,如果您在引导中添加了以下内容:

grailsApplication.domainClasses.each { org.codehaus.groovy.grails.commons.GrailsDomainClass gc ->
    gc.metaClass.afterInsert = {
        println "$id"
    }
}

您应该能够访问所有新创建的域对象并执行常见操作。

此答案对于我的原始问题是正确的,但是我在审阅和发布后更新了该问题,因为我的问题不够具体。感谢您的回答,但如果我理解正确,更新中的解决方案将问题从自定义每个控制器转移到自定义每个域类。问题是,id被传递到重定向中,例如每个脚手架控制器中的redirectaction:show,id:instance.id,是否可以通过后过滤器访问?这意味着控制器/域类中的编码和混乱程度将降至最低。您可以为所有域创建一个事件侦听器。请参阅普通的hibernate中的Linkeden。我说的是hibernate事件侦听器。我知道这个dsl只在Grails2.0中引入,但您总是可以直接使用它。请参阅hbernate docs:此答案对于我的原始问题是正确的,但是我在审查和发布后更新了该问题,因为我的问题不够具体。感谢您的回答,但如果我理解正确,更新中的解决方案将问题从自定义每个控制器转移到自定义每个域类。问题是,id被传递到重定向中,例如每个脚手架控制器中的redirectaction:show,id:instance.id,是否可以通过后过滤器访问?这意味着控制器/域类中的编码和混乱程度将降至最低。您可以为所有域创建一个事件侦听器。请参阅普通的hibernate中的Linkeden。我说的是hibernate事件侦听器。我知道这个dsl只在Grails2.0中引入,但您总是可以直接使用它。请参阅hbernate文档:我已更新了我的问题-我想对新创建的实体进行一些处理,即更新所有控制器的搜索索引。换句话说,我需要访问模型,但都是在一个更像过滤器的上下文中进行的,因为它需要应用于所有控制器。我更新了我的问题-我想对新创建的实体进行一些处理,即更新所有控制器的搜索索引。换句话说,我需要访问模型,但所有人都在一个更像过滤器的上下文中进行访问,因为它需要应用于所有控制器。