【问题标题】:How to call Grails from Scala如何从 Scala 调用 Grails
【发布时间】:2011-02-11 11:06:34
【问题描述】:

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

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

【问题讨论】:

  • 嗨 - 您能接受以下内容吗?谢谢,

标签: scala grails


【解决方案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 初始化中添加以下内容:

scalaCallback.cback = groovyCallback.GroovyCallback.getInstance()

当你在 Scala 中调用 invokeCallback("example") 时,它会调用 yourService.yourMethod("example")

注意:你的 Scala 类的 jar 文件应该在你的 Grails 应用程序的 lib 文件夹中

【讨论】:

    【解决方案2】:

    您的 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

    【讨论】:

    • 您能否提供一个示例来说明您将如何做到这一点?您还需要任何用于 Spring 的 XML 配置吗?
    • 添加示例。不需要 XML。
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多