如何从Scala调用Grails

时间:2011-02-08 20:06:02

标签: scala grails

有没有办法在同一个JVM上运行的Scala类中调用Grails服务中的方法? 我看过Groovy / Griffon做过类似的事情,但无法弄清楚如何在Grails中完成。 (http://www.jroller.com/aalmiray/entry/griffon_groovy_scala_working_together

基本上,我的一个Grails控制器会调用一些Scala代码,这些代码应该异步返回一些值。所以,我想,返回这些值的唯一方法是在Grails服务中回调一个方法。

2 个答案:

答案 0 :(得分:1)

我找到了一种方法,灵感来自上面问题中的链接,以及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)
    }
}

在Grails方面:

在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()

当您在Scala中调用invokeCallback(“example”)时,它将调用yourService.yourMethod(“example”)

注意:带有Scala类的jar文件应该位于Grails应用程序的lib文件夹中

答案 1 :(得分:1)

您的Grails服务是一个Spring bean。 @Autowire将服务放入Scala类(它需要是一个bean / @Component)并调用该方法。

编辑 - 添加了示例:

例如(使用Java,而不是Scala,但方法完全相同):

Java代码调用服务:

package grailstest;

@Component
public class ServiceInjectionTester {
    @Autowired TestService testService;

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

服务:

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

在Config.groovy中:

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

您还可以将Java / Scala bean连接到Grails类中:

class TestController {
    @Autowired
    ServiceInjectionTester serviceInjectionTester

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

参考文献:

Grails Reference 8.4 - Using Services from Java

Spring: The Foundation for Grails