Grails:如何通过过滤器中的controllerName获取控制器?

时间:2011-05-27 18:38:41

标签: grails filter

我有一个过滤器和controllerName var获取控制器目标。

例如: 当用户尝试访问/myApp/book/index时,我的过滤器会被触发,controllerName等于book。我如何获得BookController实例?

韩国社交协会


修改

我可以使用Artefact获取:

grailsApplication.getArtefactByLogicalPropertyName("Controller", "book")

但我对这件艺术品做了什么?

4 个答案:

答案 0 :(得分:15)

控制器将注册为spring bean。只需按名称抓住它:

applicationContext.getBean('mypackage.BookController') // or
def artefact = grailsApplication.getArtefactByLogicalPropertyName("Controller", "book")
applicationContext.getBean(artefact.clazz.name)

答案 1 :(得分:5)

正如Burt所说,您可能不希望过滤器中有一个控制器实例。这是解决问题的错误方法。

Grails控制器由Spring Framework自动注入,并且在创建它时会产生一些黑魔法和程序。所以,我可以向你保证,这不是解决这个问题的方法。

正如您自己所描述的,您想要调用您的操作,我可以想象您正在尝试重用一些驻留在您的操作中的代码,可能会在您的数据库中生成一些数据,甚至可以使用您的HTTP会话我是对的吗?

所以,你可以做两件事来解决这类问题。

1)只需将您的请求流重定向到您的控制器/操作,如下所示:

if (something) {
  redirect controller: 'xpto', action: 'desired'
  return false
}

2)或者你可以获得你的行动中的逻辑(即你想要运行的那个脏工作),在一个服务中分离该逻辑,并以这种方式重用两个类中的服务(动作/服务): / p>

<强> MyService.groovy

class MyService { 
  def methodToReuse() {
    (...)
  }
}

<强> MyController.groovy

class MyController {

  def myService //auto-injected by the green elf

  def myAction = {
    myService.methodToReuse()
  }
}

<强> MyFilters.groovy

class MyFilters {

  def myService //auto-injected by the red elf

  (...)
  myService.methodToReuse()
  (...)

}

[] S,

答案 2 :(得分:2)

您应该能够在您检索到的人工制品上调用newInstancenewInstance的工作方式与构造函数类似,因此您可以为普通的构造函数调用提供任何参数。

所以你可以这样做:

def bookController = grailsApplication.getArtefactByLogicalPropertyName("Controller", "book").newInstance()

答案 3 :(得分:1)

工作代码:

import org.codehaus.groovy.grails.web.context.ServletContextHolder
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes
import org.springframework.context.ApplicationContext

ApplicationContext applicationContext = (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
def grailsApplication

String nameController = "search"
def artefact = grailsApplication.getArtefactByLogicalPropertyName("Controller", nameController)
def controller = applicationContext.getBean(artefact.clazz.name)