我有一个过滤器和controllerName
var获取控制器目标。
例如:
当用户尝试访问/myApp/book/index
时,我的过滤器会被触发,controllerName
等于book
。我如何获得BookController实例?
韩国社交协会
修改
我可以使用Artefact
获取:
grailsApplication.getArtefactByLogicalPropertyName("Controller", "book")
但我对这件艺术品做了什么?
答案 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)
您应该能够在您检索到的人工制品上调用newInstance
。 newInstance
的工作方式与构造函数类似,因此您可以为普通的构造函数调用提供任何参数。
所以你可以这样做:
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)