Я нашел способ сделать это, вдохновленный ссылкой в вопросе выше, и одним из часто задаваемых вопросов на веб-сайте 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