Grails 2.0 использует значение конфигурации из внешнего файла в POGO - PullRequest
1 голос
/ 20 января 2012

Вот сценарий. У меня есть файл за пределами моего приложения Grails, который содержит URL / имя пользователя / пароль / и т.д. информация, так что разработчики не могут видеть информацию о подключении для производства. Я включаю эту информацию в Config.groovy, выполнив:

grails.config.locations << "file:" + "C:/directory/from/env/variable/data.properties"

Тогда я получал доступ к этой информации в POGO через:

import org.codehaus.groovy.grails.commons.ConfigurationHolder
...
ConfigurationHolder.config.url
ConfigurationHolder.config.userName
ConfigurationHolder.config.password

После обновления до Grails 2.0 я заметил, что ConfigurationHolder устарел. Поэтому я перешел к документации: (http://grails.org/doc/latest/guide/conf.html), чтобы попытаться выяснить, как это исправить. В документации говорится, что для получения значений конфигурации нужно использовать grailsApplication. Моя проблема в том, что я нахожусь в POGO и автоматическое подключение Grails к grailsApplication не вызывается. Мой вопрос состоит из 2 частей:

1) Есть ли лучший способ получить информацию о конфигурации из файла, находясь внутри POGO?

2) Если нет лучшего способа, как мне добавить приложение grailsApplication в POGO?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я использую плагин Grails GLDAPO (http://gldapo.codehaus.org/) для взаимодействия с каталогом LDAP. Я пытаюсь заставить эти объекты (которые я поместил в / src / groovy) действовать так же, как объекты домена в что у меня могут быть статические методы для выполнения findBy...(..). С шаблоном, который вы предлагаете, я ДОЛЖЕН пройти через службу для извлечения данных. Что неплохо, это просто не как Groovy:)

Ответы [ 2 ]

5 голосов
/ 20 января 2012

Новый ответ на основе обновленного вопроса.

У вас есть несколько вариантов. Один из них заключается в подключении grailsApplication к метаклассу для этих классов, то есть в BootStrap.groovy:

class BootStrap {

   def grailsApplication

   def init = { servletContext ->
      YourClass.metaClass.getGrailsApplication = { -> grailsApplication }
   }
}

Это добавит метод getGrailsApplication, к которому можно получить доступ как свойство grailsApplication.

Другой вариант - добавить к этим классам статическое поле grailsApplication и установить его в BootStrap:

class BootStrap {

   def grailsApplication

   def init = { servletContext ->
      YourClass.grailsApplication = grailsApplication
   }
}

Также см. это сообщение в блоге , в котором обсуждается создание классов-держателей, и это , в котором рассматриваются переопределяющие конструкторы.

0 голосов
/ 20 января 2012

Вы должны вызывать его из артефакта, который может внедрить бин grailsApplication в зависимости, по крайней мере косвенно.Добавьте def grailsApplication к сервису или заданию Quartz или к тому, что вызывает ваш POGO, и передайте ему grailsApplication.config для вызовов методов, которые в этом нуждаются, или один раз в установщике.

...