Grails: как получить контроллер по controllerName в фильтре? - PullRequest
4 голосов
/ 27 мая 2011

У меня есть фильтр и controllerName var, получающий цель контроллера.

Например: когда пользователь пытается получить доступ к /myApp/book/index, мой фильтр срабатывает и controllerName равен book. Как я могу получить экземпляр BookController?

Tks

* * 1010

EDIT:

Я могу получить Artefact, используя:

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

Но что мне делать с этим артефактом?

Ответы [ 4 ]

15 голосов
/ 28 мая 2011

Контроллер будет зарегистрирован как пружинный компонент. Просто возьмите его по имени:

applicationContext.getBean('mypackage.BookController') // or
def artefact = grailsApplication.getArtefactByLogicalPropertyName("Controller", "book")
applicationContext.getBean(artefact.clazz.name)
5 голосов
/ 28 мая 2011

Как сказал Берт, вам, вероятно, не нужен один экземпляр контроллера внутри вашего фильтра. Это неправильный способ решить вашу проблему.

Контроллеры Grails автоматически внедряются Spring Framework, и при его создании были сделаны некоторые черные операции и процедуры. Итак, я могу заверить вас, что это не способ решить эту проблему.

Как вы сами описали, вы хотите вызвать свое действие, и я могу представить, что вы пытаетесь повторно использовать некоторый код, который находится в вашем действии, возможно, для генерации некоторых данных в вашей базе данных или даже для работы с вашим сеансом HTTP я прав?

Итак, вы можете сделать две вещи, чтобы решить эту проблему.

1) Просто перенаправьте ваш поток запросов на ваш контроллер / действие следующим образом:

* * 1010

2) Или вы можете получить логику внутри своего действия (то есть выполнять ту грязную работу, которую хотите запустить), отделить эту логику внутри одного сервиса и повторно использовать сервис в обоих классах (действие / сервис) следующим образом:

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 голосов
/ 28 мая 2011

Вы должны быть в состоянии позвонить newInstance на артефакт, который вы получили. newInstance работает так же, как конструктор, поэтому вы можете предоставить любые параметры, которые вы бы использовали для обычного вызова конструктора.

Так что вы, вероятно, можете просто сделать:

def bookController = grailsApplication.getArtefactByLogicalPropertyName("Controller", "book").newInstance()
1 голос
/ 02 июля 2012

Рабочий код:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...