Configuração de Grails Plugin
Pergunta
Estou desenvolvendo meu primeiro Grails plugin. Ele tem que acessar um webservice. O Plugin irá, obviamente, precisa a url webservice. Qual é a melhor maneira de configurar isso sem codificar que nas classes Groovy? Seria bom com configuração diferente para diferentes ambientes.
Solução
Se o seu apenas uma pequena (leia-se: um item) opção de configuração, ele só poderia ser mais fácil de gole em um arquivo de propriedades. Se houver um número de opções de configuração, e alguns deles deve ser dinâmico, eu gostaria de sugerir fazendo o que o plugin Acegi segurança não - adicionar um arquivo para /grails-app/conf/plugin_name_config.groovy talvez.
vantagem adicional é que o usuário pode executar código Groovy para calcular suas opções de configuração (muito melhor sobre o uso de arquivos de propriedades), bem como ser capaz de fazer diferentes ambientes com facilidade.
http://groovy.codehaus.org/ConfigSlurper , que é o que Grails uso interno slurp configs como Config.groovy.
//e.g. in /grails-app/conf/MyWebServicePluginConfig.groovy
somePluginName {
production {
property1 = "some string"
}
test {
property1 = "another"
}
}
//in your myWebServicePlugin.groovy file, perhaps in the doWithSpring closure
GroovyClassLoader classLoader = new GroovyClassLoader(getClass().getClassLoader())
ConfigObject config
try {
config = new ConfigSlurper().parse(classLoader.loadClass('MyWebServicePluginConfig'))
} catch (Exception e) {/*??handle or what? use default here?*/}
assert config.test.property1.equals("another") == true
Outras dicas
Você pode querer Keep It Simple (tm). Você pode definir o URL diretamente no Config.groovy -incluindo settings- per-ambiente e acessá-lo a partir do seu plug-in, conforme necessário usando grailsApplication.config (na maioria dos casos) ou um objeto ConfigurationHolder.config (Veja mais detalhes no manual).
Como um bônus adicional que a configuração também pode ser definida em arquivos de propriedade padrão Java ou em outros arquivos de configuração especificados no grails.config.locations.
por exemplo. em Config.groovy
// This will be the default value...
myPlugin.url=http://somewhe.re/test/endpoint
environments {
production {
// ...except when running in production mode
myPlugin.url=http://somewhe.re/for-real/endpoint
}
}
depois, em um serviço prestado por seu plugin
import org.codehaus.groovy.grails.commons.ConfigurationHolder
class MyPluginService {
def url = ConfigurationHolder.config.myPlugin.url
// ...
}