Получение конфигурации приложения в закрытии doWithSpring с помощью приложения Grails 3

Grails 3 позволяет авторам использовать обработчики запуска, аналогичные тем, что есть в подключаемых модулях Grails 2. Я рассматриваю определение bean-компонентов в замыкании doWithSpring и хочу передать значения в новый bean-компонент на основе некоторых значений конфигурации. Однако я не могу понять, как получить экземпляр grailsApplication или конфигурацию приложения. Как это сделать с Grails 3?


person BudJB    schedule 13.04.2015    source источник
comment
Я потратил некоторое время на поиски и не смог найти ни один из плагинов, которые бы делали это. В итоге я вытащил конфигурацию из фактического приложения и передал элемент конфигурации плагину. Честно говоря, сам не доволен этим. .. github.com/vahidhedayati/RemoteSSH/tree/grails3   -  person V H    schedule 14.04.2015
comment
Сам не доволен если честно. - @vahid Смотрите мой ответ ниже. В вашем плагине вы можете просто обратиться к свойству config. Это то, что вы ищете?   -  person Jeff Scott Brown    schedule 17.04.2015


Ответы (2)


Ваш плагин должен расширять grails.plugins.Plugin, который определяет метод getConfig(). См. https://github.com/grails/grails-core/blob/9f78cdf17e140de37cfb5de6671131df3606f2fe/grails-core/src/main/groovy/grails/plugins/Plugin.groovy#L65.

Вы должны иметь возможность просто ссылаться на свойство config.

Аналогичным образом вы можете обратиться к унаследованному свойству grailsApplication, которое определено по адресу https://github.com/grails/grails-core/blob/9f78cdf17e140de37cfb5de6671131df3606f2fe/grails-core/src/main/groovy/grails/plugins/Plugin.groovy#L47< /а>.

Надеюсь, это поможет.

person Jeff Scott Brown    schedule 17.04.2015
comment
Должен ли класс конфигурации теперь также расширять grails.plugins.Plugin, чтобы это работало? - Нет. Только класс плагина должен расширять grails.plugins.Plugin. Из кода в вашей ветке grails3 неясно, что вы действительно пытаетесь сделать, но, основываясь на версии, которая находится в ветке master, вы, вероятно, захотите зарегистрировать SshConfig bean-компонент в doWithSpring и просто внедрить значения конфигурации оттуда. Я бы также использовал GrailsApplicationAware вместо явного внедрения bean-компонента grailsApplication, но это может вообще не понадобиться. - person Jeff Scott Brown; 18.04.2015
comment
Часть кода в вашей ветке master для меня бессмысленна. - person Jeff Scott Brown; 18.04.2015
comment
Привет, Джефф, у меня все работает, поэтому через минуту я добавлю полный пошаговый ответ на этот вопрос. Что касается бессмысленности, вы имели в виду повторяющиеся классы Java / Groovy :) (был мой первый плагин и прекрасный беспорядок) Берт любезно исправил беспорядок и предоставил отличный вариант. Я думаю, что классы Groovy хороши сами по себе, их можно очистить и выпустить под 2, если хотите. - person V H; 18.04.2015
comment
Это полезная информация для новичков в написании подключаемых модулей Grails 3, однако вопрос был нацелен на приложения Grails 3, а не на подключаемые модули. Более подробную информацию можно найти по адресу grails.1312388.n4.nabble.com/. - person BudJB; 19.04.2015
comment
@BudJB Для приложений вы можете переопределить doWithSpring в своем подклассе Application. - person Jeff Scott Brown; 28.08.2015

В Grails 3 я последовал совету Джеффа Скотта Брауна и вместо этого использовал GrailsApplicationAware:

Вот как вы подходите к настройке bean-компонента конфигурации:

Таким образом, в вашем новом дескрипторе плагина вам нужно изменить определение стиля Grails 2 doWithSpring на ClosureDoWithSpring, как показано ниже:

Обратите внимание, что в Grails 2 мы внедрили приложение grailsApplication, а в Grails 3 мы всего лишь объявляем bean-компонент:

/*
    def doWithSpring = {
        sshConfig(SshConfig) {
          grailsApplication = ref('grailsApplication')
        }
    }
*/
   Closure doWithSpring() { {->
        sshConfig(SshConfig)
        } 
    }

Теперь, чтобы получить конфигурацию вашего плагина:

src/main/groovy/grails/plugin/remotessh/SshConfigSshConfig.groovy

package grails.plugin.remotessh

import grails.core.GrailsApplication
import grails.core.support.GrailsApplicationAware

class SshConfig implements GrailsApplicationAware {

    GrailsApplication grailsApplication


    public ConfigObject getConfig() {
        return grailsApplication.config.remotessh ?: ''

    }

}

grails.plugin.remotessh.RemoteSsh.groovy:

String Result(SshConfig ac) throws InterruptedException {

        Object sshuser = ac.config.USER ?: ''
        Object sshpass = ac.config.PASS ?: ''
...

Теперь это ваш объект конфигурации, который передается в ваши классы src groovy. Приложение конечного пользователя передаст bean-компонент sshConfig следующим образом:

class TestController {

    def sshConfig

    def index() {
        RemoteSSH rsh = new RemoteSSH()
      ....
        def g = rsh.Result(sshConfig)
    }

Отредактировано, чтобы добавить, только что нашел это :), что актуально или дублирует вопрос:

http://grails.1312388.n4.nabble.com/Getting-application-config-in-doWithSpring-closure-with-a-Grails-3-application-td4659165.html

person V H    schedule 18.04.2015
comment
Я начал тему в группе разработчиков Grails в Google, так как в то время здесь не было большой популярности. Просто для контекста :) - person BudJB; 19.04.2015
comment
Ха, и да, я связываю их обоих здесь, чтобы другим в будущем было намного меньше боли, а также разные подходы к проблемам одного и того же типа. Это все хорошие вещи :) - person V H; 19.04.2015