当我的Grails应用程序启动时,我也会在后台开始Spring Integration和Batch过程。我想在Config.groovy文件中存储一些数据库连接属性,但是如何从集成/批处理过程中使用的Java类访问它们?
我找到了这个帖子:
Converting Java -> Grails ... How do I load these properties?
建议使用:
private Map config = ConfigurationHolder.getFlatConfig();
后跟类似的内容:
String driver = (String) config.get("jdbc.driver");
这实际上工作正常(从Config.groovy正确加载了属性)但问题是ConfigurationHolder在被弃用之后。我发现处理该问题的任何线程似乎都是Grails特定的并建议使用依赖注入,就像在这个线程中一样:
How to access Grails configuration in Grails 2.0?
是否有一种不推荐的方法可以从Java类文件访问Config.groovy属性?
答案 0 :(得分:4)
只是要注册,在Grails 2.x中,有一个Holders class替换了这个已弃用的持有者。您可以使用它来访问静态上下文中的grailsApplication
。
答案 1 :(得分:3)
刚刚检查了一些现有代码,我使用了this method described by Burt Beckwith
创建新文件:src/groovy/ctx/ApplicationContextHolder.groovy
package ctx
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
import javax.servlet.ServletContext
import org.codehaus.groovy.grails.commons.GrailsApplication
import org.codehaus.groovy.grails.plugins.GrailsPluginManager
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
@Singleton
class ApplicationContextHolder implements ApplicationContextAware {
private ApplicationContext ctx
private static final Map<String, Object> TEST_BEANS = [:]
void setApplicationContext(ApplicationContext applicationContext) {
ctx = applicationContext
}
static ApplicationContext getApplicationContext() {
getInstance().ctx
}
static Object getBean(String name) {
TEST_BEANS[name] ?: getApplicationContext().getBean(name)
}
static GrailsApplication getGrailsApplication() {
getBean('grailsApplication')
}
static ConfigObject getConfig() {
getGrailsApplication().config
}
static ServletContext getServletContext() {
getBean('servletContext')
}
static GrailsPluginManager getPluginManager() {
getBean('pluginManager')
}
// For testing
static void registerTestBean(String name, bean) {
TEST_BEANS[name] = bean
}
// For testing
static void unregisterTestBeans() {
TEST_BEANS.clear()
}
}
然后,修改grails-app/config/spring/resources.groovy
以包含:
applicationContextHolder(ctx.ApplicationContextHolder) { bean ->
bean.factoryMethod = 'getInstance'
}
然后,在src/java
或src/groovy
内的文件中,您可以致电:
GrailsApplication app = ApplicationContextHolder.getGrailsApplication() ;
ConfigObject config = app.getConfig() ;
答案 2 :(得分:1)
我无法理解为什么这不起作用,但我可以完全建议另一种方法。 Grails设置PropertyPlaceholderConfigurer
,其值来自grailsApplication.config
,因此您可以声明
public void setDriver(String driver) { ... }
在你班上,然后说
<bean class="com.example.MyClass" id="exampleBean">
<property name="driver" value="${jdbc.driver}" />
</bean>
如果您正在使用bean DSL,这也适用于resources.groovy
,但您必须记住使用单引号而不是加倍:
exampleBean(MyClass) {
driver = '${jdbc.driver}'
}
使用"${jdbc.driver}"
不起作用,因为Groovy将其解释为GString并且在处理resources.groovy
时(未能)解析,而您需要的是放置文字{{1}表达式作为稍后由占位符配置器解析的属性值。