Доступ к grailsApplication или Service в классе groovy

Я пытаюсь получить доступ к grailsApplication в классе groovy в разделе src/groovy, но я получаю исключение с нулевым указателем. Я также пытался ввести службу в тот же класс и тот же результат. Как я могу получить доступ к grailsApplication или к службе из класса groovy? (Я использую Grails 1.3.7)

Ответ 1

Инъекция не работает для классов groovy под src/groovy. Вы можете получить доступ к grailsApplication с помощью ApplicationHolder следующим образом:

import org.codehaus.groovy.grails.commons.ApplicationHolder

def grailsApplication = ApplicationHolder.application

Вы можете получить доступ ко всем таким службам:

def allServicesArtefacts = grailsApplication.services

Ответ 2

Класс ApplicationHolder устарел в новых версиях Grails (2.0 и выше).

Существует еще один способ, описанный в одном из блогов-сообщений Burt: http://burtbeckwith.com/blog/?p=1017

Ответ 3

Если у вас есть классы, которые вы хотите участвовать в инъекции зависимости от src/ groovy или src/java или даже сторонних банках, вам нужно настроить их в grails-app/conf/spring/resources.groovy.

Если у вас есть класс mypackage.MyClass в каталоге src/ groovy, который выглядит так:

package mypackage
class MyClass{
    def grailsApplication
    def myMethod(){
        //uses grailsApplication
    }
}

Затем, добавив следующее в grails-app/conf/ spring/resoruces.groovy, он будет автоматически вводиться:

myClass(mypackage.MyClass){bean->
    bean.autowire = "byName"    
}

Это будет работать в любой версии grails, поэтому, как я уже сказал, вы даже можете использовать сторонние банки - например, я ВСЕГДА имею в своих ресурсах следующее:

jdbcTemplate(org.springframework.jdbc.core.JdbcTemplate){
    dataSource = ref('dataSource')
}

Для более подробной документации Spring/Grails см.:

http://grails.github.io/grails-doc/latest/guide/spring.html

Ответ 4

После Grails 2.0 вы должны использовать:

 def grailsApplication = Holders.grailsApplication