Как получить доступ к динамическим свойствам контроллера в конструкторе базового контроллера в Grails? - PullRequest
0 голосов
/ 16 июня 2010

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

Вот как я пытался, но не заставил его работать.

Я пытаюсь добиться того, чтобы все мои контроллеры расширили базуконтроллер.Конструктор базового контроллера будет использоваться для присвоения значений его элементам, которые извлекаются из карты session .Пример ниже.

Файл grails-app / controllers / HomeController.groovy:

class HomeController extends BaseController {
    def index = {
        render username
    }
}

Файл grails-app / controllers / BaseController.groovy:

abstract class BaseController {
    public String username

    public BaseController() {
        username = session.username
    }
}

Когдапри запуске приложения выводится следующее:

2010-06-15 18:17:16,671 [main] ERROR [localhost].[/webapp]  - Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
    ...
Caused by: java.lang.RuntimeException: Unable to locate constructor with Class parameter for class org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
    ...
Caused by: java.lang.reflect.InvocationTargetException
    ...
Caused by: org.codehaus.groovy.grails.exceptions.NewInstanceCreationException: Could not create a new instance of class [com.my.package.controller.HomeController]!
    ...
Caused by: groovy.lang.MissingPropertyException: No such property: session for class: com.my.package.controller.HomeController
    at com.my.package.controller.BaseController.<init>(BaseController.groovy:16)
    at com.my.package.controller.HomeController.<init>(HomeController.groovy)
    ...
2010-06-15 18:17:16,687 [main] ERROR core.StandardContext  - Error listenerStart
2010-06-15 18:17:16,687 [main] ERROR core.StandardContext  - Context [/webapp] startup failed due to previous errors

И приложение не запускается.

Это всего лишь пример, так как в моем случае я не хотел бы назначать имя пользователяк строковому значению, а скорее к нескольким объектам, извлеченным из карты session .Объекты, извлеченные из карты сеанс , устанавливаются внутри фильтров.

Альтернатива, которую я вижу, заключается в возможности доступа к экземпляру контроллера во время выполнения фильтра.Это возможно?

Пожалуйста, помогите!Спасибо большое!

Ответы [ 3 ]

4 голосов
/ 16 июня 2010

Обычно в конструкторе в артефактах Grails мало что можно сделать.Для этого вы можете использовать перехватчик:

abstract class BaseController {
   protected String username

   def beforeInterceptor = {
      username = session.username
   }
}

Это описано в разделе 6.1.5 http://grails.org/doc/latest/

0 голосов
/ 16 июня 2010

Как правило, я бы предостерегал от помещения состояния непосредственно в контроллер; Контроллеры в целом (независимо от структуры), как правило, предназначены для сохранения состояния. Я бы придерживался стандартных конструкций состояния веб-приложения, таких как запрос и сессия, для хранения и передачи данных.

Для вашего конкретного случая я бы сделал одно из следующих действий:

  • Если бы легкие данные (примитивы), я сохранял их в сеансе и просто обращался к ним при необходимости:
    например отрендерить session.username

  • Если используются динамические данные или данные на основе базы данных, я бы создал службу и извлекал данные по мере необходимости: например homeService.getUser (). Имя пользователя

  • В качестве варианта вашего обсуждения с Бертом выше вы можете использовать фильтр для заполнения значения запроса или сеанса.

0 голосов
/ 16 июня 2010

Вы можете использовать услугу в рамках запроса ...

...