6

当我的 Grails 应用程序启动时,我还会在后台启动 Spring Integration and Batch 进程。我想在 Config.groovy 文件中存储一些数据库连接属性,但是如何从集成/批处理过程中使用的 Java 类访问它们?

我找到了这个线程:

转换 Java -> Grails ...如何加载这些属性?

这建议使用:

private Map config = ConfigurationHolder.getFlatConfig();

其次是:

String driver = (String) config.get("jdbc.driver");

这实际上工作正常(从 Config.groovy 正确加载属性),但问题是 ConfigurationHolder 在被弃用之后。我发现处理该问题的任何线程似乎都是 Grails 特定的,并建议使用依赖注入,就像在这个线程中一样:

如何在 Grails 2.0 中访问 Grails 配置?

那么有没有一种不被弃用的方法来从 Java 类文件中访问 Config.groovy 属性?

4

3 回答 3

4

刚刚检查了我现有的一些代码,我使用了 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/javaor src/groovy,你可以调用:

GrailsApplication app = ApplicationContextHolder.getGrailsApplication() ;
ConfigObject config = app.getConfig() ;
于 2012-11-01T09:56:24.580 回答
4

只是为了注册,在 Grails 2.x 中,有一个Holders 类来替换这个已弃用的持有者。您可以使用它grailsApplication在静态上下文中访问。

于 2013-05-17T02:05:27.513 回答
1

我无法弄清楚为什么这不起作用,但我可以完全建议一种替代方法。Grails 设置了从PropertyPlaceholderConfigurer中获取其值的a grailsApplication.config,因此您可以声明 a

public void setDriver(String driver) { ... }

在你的课上然后说

<bean class="com.example.MyClass" id="exampleBean">
  <property name="driver" value="${jdbc.driver}" />
</bean>

resources.groovy如果您使用的是 beans DSL,这也适用,但您必须记住使用单引号而不是双引号:

exampleBean(MyClass) {
  driver = '${jdbc.driver}'
}

Using"${jdbc.driver}"不起作用,因为它被 Groovy 解释为 GString 并且(无法)在resources.groovy处理时解析,而您需要将文字${...}表达式作为属性值放入,稍后由占位符配置器解析。

于 2012-10-31T16:52:06.047 回答