有没有办法在同一个JVM上运行的Scala类中调用Grails服务中的方法? 我看过Groovy / Griffon做过类似的事情,但无法弄清楚如何在Grails中完成。 (http://www.jroller.com/aalmiray/entry/griffon_groovy_scala_working_together)
基本上,我的一个Grails控制器会调用一些Scala代码,这些代码应该异步返回一些值。所以,我想,返回这些值的唯一方法是在Grails服务中回调一个方法。
答案 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())
}
}
参考文献: