6

如何使用中static定义的值初始化变量config.groovy

目前我有这样的事情:

class ApiService {
    JSON get(String path) {
        def http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}")
        ...
    }
    JSON get(String path, String token) {
        def http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}")
        ...
    }
    ...
    JSON post(String path, String token) {
        def http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}")
        ...
    }
}

我不想http在每个方法(几个 GET、POST、PUT 和 DELETE)中定义变量。

我想将http变量作为static服务中的变量。

我试过这个没有成功:

class ApiService {

    static grailsApplication
    static http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}")

    JSON get(String path) {
        http.get(...)
        ...
    }
}

我明白了Cannot get property 'config' on null object。与以下相同:

class ApiService {

    def grailsApplication
    static http

    ApiService() {
        super()
        http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}")
    }

    JSON get(String path) {
        http.get(...)
        ...
    }
}

我也试过没有static定义,但同样的错误Cannot get property 'config' on null object

class ApiService {

    def grailsApplication
    def http

    ApiService() {
        super()
        http = new HTTPBuilder("${grailsApplication.config.grails.api.server.url}")
    }
}

有什么线索吗?

4

1 回答 1

15

使用实例属性而不是静态属性(因为服务 bean 是单例范围的)。您无法在构造函数中进行初始化,因为尚未注入依赖项,但您可以使用 annotated 方法@PostConstruct,该方法将在依赖项注入后由框架调用。

import javax.annotation.PostConstruct

class ApiService {
  def grailsApplication
  HTTPBuilder http

  @PostConstruct
  void init() {
    http = new HTTPBuilder(grailsApplication.config.grails.api.server.url)
  }

  // other methods as before
}
于 2012-12-14T16:02:35.453 回答