如何从 Scala 调用 Grails

发布于 2024-10-16 18:43:53 字数 373 浏览 0 评论 0原文

有没有办法从同一 JVM 上运行的 Scala 类调用 Grails 服务中的方法? 我已经看到 Groovy/Griffon 做了类似的事情,但不知道如何在 Grails 中实现这一点。 (http://www.jroller.com/aalmiray/entry/griffon_groovy_scala_working_together

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

Is there a way to call a method in a Grails service, from a Scala class that is running on the same JVM?
I have seen something similar done from Groovy/Griffon but cannot figure out how to accomplish that in Grails. (http://www.jroller.com/aalmiray/entry/griffon_groovy_scala_working_together)

Basically, one of my Grails controllers calls some Scala code, which should return some values asynchronously. So, I guess, the only way to return those values is by calling back a method in a Grails service.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦行七里 2024-10-23 18:43:53

受到上述问题中的链接以及 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 文件夹中

I found a way of doing it, inspired by the link in the question above, and one of the FAQs in the Grails website.

On the Scala side:
Declare an object similar to the following:

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)
    }
}

On the Grails side:

Create a class in src/groovy similar to the following:

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)   
    }
}

In your BootStrap.groovy init add the following:

scalaCallback.cback = groovyCallback.GroovyCallback.getInstance()

When you call invokeCallback("example") in Scala, it will call yourService.yourMethod("example")

Note: the jar file with your Scala class should be in the lib folder of you Grails application

以酷 2024-10-23 18:43:53

您的 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();
    }
}

Service:

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 参考 8.4 - 使用来自 Java 的服务

Spring:基础圣杯

Your Grails service is a Spring bean. @Autowire the service into your Scala class (it will need to be a bean/@Component) and call the method.

EDIT - added example:

For example (using Java, not Scala but the approach is exactly the same):

Java code calling service:

package grailstest;

@Component
public class ServiceInjectionTester {
    @Autowired TestService testService;

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

Service:

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

In Config.groovy:

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

You can also wire your Java/Scala bean into your Grails classes:

class TestController {
    @Autowired
    ServiceInjectionTester serviceInjectionTester

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

References:

Grails Reference 8.4 - Using Services from Java

Spring: The Foundation for Grails

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文