Вопрос по – Grails 2.x сервисный впрыск в Groovy / src

12

Я хотел бы добавить свой сервис в класс Groovy / src. Нормальное внедрение зависимостей не работает:

...
def myService
...

Я могу использовать это (это работает):

def appCtx = ApplicationHolder.application.getMainContext()
def myService = appCtx.getBean("myService");

но ApplicationHolder устарел. Есть ли лучшее решение?

Спасибо за любое предложение

Я использую его внутри других классов Groovy (он создается там). Есть класс groovy для фасада, который используется сервисом, который запускает все эти процедуры. Я не хочу передавать использованный сервис в качестве параметров, чтобы не передавать столько параметров ... kuceram
Как ты используешь этот «класс src»? Где и как вы это создаете? Igor Artamonov

Ваш Ответ

4   ответа
2

е) компоненты, настроив их вgrails-app/conf/spring/resources.groovy:

// src/groovy/com/example/MyClass.groovy
class MyClass {
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {
        myService = ref('myService')
    }
}

Также вы можете проверить этот вопрос о Как получить доступ к конфигурации Grails в Grails 2.0?

Теперь я вижу, что это не работает для меня. Я не могу связать службу или другие свойства в resources.groovy следующим образом: `import com.path.to.ResidentAtPlace beans = {residentAtPlaceBean (ResidentAtPlace) {someProperty = 45 placeService = ref ('placeService') grailsApplication = ref ('grailsApplication') )}} `В моем ResidentAtPlace.groovy все пусто. Вы видите какие-либо проблемы? Я использую Грааль 2.0.3 kuceram
то же самое происходит со мной, есть идеи почему? mathifonseca
12

чтобы получить доступ к контексту приложения из источников в src / groovy -http: //grails.org/FAQ#: Как мне получить доступ к контексту приложения из источников в src / groovy?

Нет класса ApplicationContextHolder, эквивалентного ApplicationHolder. Чтобы получить доступ к классу службы EmailService из класса Groovy в src / groovy, используйте bean-компонент Spring с помощью:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT)
def emailService = ctx.emailService
@ ubiquibacon - да, но «def emailService = ctx.emailService» будет транзакционной службой. Извините, но в чем проблема с доступом к такой службе? Saurabh
Я не думаю, что это квалифицируется как «внедрение зависимости». Я должен сделать некоторое тестирование, чтобы проверить это все же. ubiquibacon
@ ubiquibacon каков результат расследования? biniam
Пока это позволит вам получить доступ к методам в службе, это нарушит транзакцию служб. Выдержка из Декларативные транзакции: Warning: внедрение зависимостей - единственный способ работы декларативных транзакций. Вы не получите транзакционную услугу, если будете использовать новый оператор, такой как new BookService () ubiquibacon
28

Замена ApplicationHolder может быть Держатели, вы также можете использовать его в статической области видимости:

import grails.util.Holders
...

def myService = Holders.grailsApplication.mainContext.getBean 'myService'
работает в Grails 3.0 тоже! boraas
2

Ты можешь сделать это изresources.groovy:

// src/groovy/com/example/MyClass.groovy
class MyClass {
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {
        myService = ref('myService')
    }
}

или просто с помощью автоматической аннотации:

// src/groovy/com/example/MyClass.groovy

import org.springframework.beans.factory.annotation.Autowired

class MyClass {
    @Autowired 
    def myService
    ...
}

// resources.groovy
beans = {
    myclass(com.example.MyClass) {}
}

Похожие вопросы