【问题标题】:Accessing grails application config from a quartz job从石英作业访问 grails 应用程序配置
【发布时间】:2014-07-28 09:55:18
【问题描述】:

使用 grails 2.4.2,quartz:1.0.2,我正在尝试访问配置属性

class MyJob {
  def grailsApplication
  int propA
  def MyJob() {
    propA = grailsApplication.config.foo.bar.propAVal
  }
  ...
}

但是,grailsApplication 没有被注入,并且为空。

Can't access any bean from Quartz Job in Grails 据说与此有关,但我真的不明白标记的答案如何解决 OP 的问题:-/

帮助? 10 倍

【问题讨论】:

  • 你在哪里定义了你的工作类别?它在 grails-app/jobs/ 文件夹中吗?
  • @LalitAgarwal:是的。我刚刚使用了'grails create-job'
  • 好的。它应该可以工作,但是,你可以试试这个“Holders.config.foo.bar.propAVal”而不是grailsApplication。您还需要导入 grails.util.Holders
  • @LalitAgarwal:这种用法不是已弃用吗?
  • 不,不是。不推荐使用 ConfigurationHolder。持有人最新 API 链接:grails.org/doc/latest/api/grails/util/Holders.html

标签: grails dependency-injection task quartz-scheduler jobs


【解决方案1】:
import grails.util.Holders

class MyJob {
    def grailsApplication = Holders.getGrailsApplication()
    int propA
    def MyJob() {
        propA = grailsApplication.config.foo.bar.propAVal
    }
    ...
}

通过这种方式,您可以从 Quartz 作业或什至从“/src”文件夹中的任何 groovy 文件访问“grailsApplication”。

【讨论】:

    【解决方案2】:

    问题可能是您在构造函数中访问grailsApplication,它尚未注入。

    我建议转储无用的类属性int propA 并这样做:

      def grailsApplication
    
      def execute() {
        def propA = grailsApplication.config.foo.bar.propAVal         
        ... 
        //use propA for something
      }
    

    【讨论】:

    • 感谢@lukelazarovicless。虽然在运行应用程序时上述内容确实有效(grailsApplication != null),但在从集成测试执行测试时 grailsApplication 仍然为 null:class MyJobSpec extends IntegrationSpec { def myJob = new MyJob() void "test something"() { 。 .. myJob.execute() } }
    • @lukelazarovicless:回到你原来的建议:我认为加载的属性属于任务类。然后,通过类 API 访问此属性是有意义的。因此,如果测试需要访问该属性,它不会直接从配置中加载它,而是调用 myJob.propA。我认为春天会允许这样的实施。使用 grails 将如何实现这一点? DI 已经完成但在对象暴露给用户之前是否可能存在另一个钩子(除了 ctor)?
    • 这超出了这个问题的范围,可能是Spock特有的,不能通过cmets来解决。为它发布另一个问题。
    • @pointyhat 这就是您可以在集成测试中做的事情。类 MyJobSpec 扩展 IntegrationSpec { def grailsApplication void "test something"() { def myJob = new MyJob(); myJob.grailsApplication = grailsApplication;myJob.execute() } }
    【解决方案3】:

    对于那些使用 grails 3.x 的用户,现在必须明确指定 grailsApplication 的类型。例如。而不是:

    def grailsApplication
    

    你需要使用:

    import grails.core.GrailsApplication
    ...
    GrailsApplication grailsApplication
    


    如果不这样做,您将收到以下编译错误:

    namespace.classnameJob中java.lang.Object getGrailsApplication()的返回类型与grails.core.GrailsApplication不兼容 grails.plugins.quartz.QuartzJob

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多