Как позвонить Граалям из Скалы - PullRequest
0 голосов
/ 08 февраля 2011

Есть ли способ вызвать метод в сервисе Grails из класса Scala, работающего на той же JVM? Я видел нечто подобное из Groovy / Griffon, но не могу понять, как этого добиться в Grails. (http://www.jroller.com/aalmiray/entry/griffon_groovy_scala_working_together)

По сути, один из моих контроллеров Grails вызывает некоторый код Scala, который должен возвращать некоторые значения асинхронно. Так что, я думаю, единственный способ вернуть эти значения - это вызвать метод в сервисе Grails.

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Ваш сервис Grails - это Spring bean.@Autowire службы в ваш класс Scala (это должен быть компонент / @ компонент) и вызвать метод.

EDIT - добавлен пример:

Например(используя Java, а не Scala, но подход точно такой же):

Служба вызова кода Java:

package grailstest;

@Component
public class ServiceInjectionTester {
    @Autowired TestService testService;

    public String testTheService() {
        return testService.serviceMethod();
    }
}

Служба:

class TestService {
    String serviceMethod() {
        return "success"
    }
}

In Config.groovy:

grails.spring.bean.packages = [ "grailstest" ]

Вы также можете подключить ваш Java / Scala bean к своим классам Grails:

class TestController {
    @Autowired
    ServiceInjectionTester serviceInjectionTester

    def index = { 
        render(text: serviceInjectionTester.testTheService())
    }
}

Ссылки:

Справочник по Grails 8.4 - Использование сервисовс Явы

Весна: основа для Грааля

1 голос
/ 09 февраля 2011

Я нашел способ сделать это, вдохновленный ссылкой в ​​вопросе выше, и одним из часто задаваемых вопросов на веб-сайте Grails.

На стороне Scala: Объявите объект, подобный следующему:

package scalaCallback

object ScalaCallback{
    var cback: {def callback(example: String)} = null

    def setCallback(cb: {def callback(example: String)}){
        cback = cb
    }

    def invokeCallback(example: String){
        if(callback != null) cback.callback(example)
    }
}

На стороне Грааля:

Создайте класс в src / groovy, подобный следующему:

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

class GroovyCallback{
    private GroovyCallback() {}
    private static final INSTANCE = new GroovyCallback()

    static getInstance(){ return INSTANCE }

    void callback(String example){
        ApplicationHolder.application.mainContext.yourService.yourMethod(example)   
    }
}

В вашем BootStrap.groovy init добавьте следующее:

scalaCallback.cback = groovyCallback.GroovyCallback.getInstance()

Когда вы вызываете invokeCallback ("пример") в Scala, он вызывает yourService.yourMethod ("пример")

Примечание: файл jar с вашим классом Scala должен находиться в папке lib вашего приложения Grails

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...