2011-02-08 10 views
0

同じJVM上で実行されているScalaクラスからGrailsサービスのメソッドを呼び出す方法はありますか? 私はGroovy/Griffonと同様のことをしましたが、Grailsでそれを達成する方法を理解することはできません。 (http://www.jroller.com/aalmiray/entry/griffon_groovy_scala_working_togetherScalaからGrailsを呼び出す方法

基本的に私のGrailsコントローラの1つでは、いくつかの値を非同期的に返すScalaコードを呼び出しています。ですから、これらの値を返す唯一の方法は、Grailsサービスでメソッドを呼び出すことです。

+0

こんにちは - することができますあなたは以下を受け入れる?ありがとう、 – sourcedelica

答えて

1

上記の質問のリンクに触発され、GrailsのWebサイトにあるよくある質問の1つが見つかりました。 Scalaの側では

: 次のようなオブジェクトを宣言します。

Grailsの側では
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 /でクラスを作成します。

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(「例」)を呼び出すと、それは

注yourService.yourMethod(「例」)を呼び出します:あなたのScalaのクラスとjarファイルは、あなたのGrailsアプリケーションのlibフォルダにする必要があります

1

GrailsサービスはSpring Beanです。 @スカラークラスにサービスを追加し(Bean/@ Componentである必要があります)、メソッドを呼び出します。

EDIT - 追加例:例えば

(Javaを使用して、ないスカラしかしアプローチはまったく同じである):

Javaコード呼び出しサービス:

package grailstest; 

@Component 
public class ServiceInjectionTester { 
    @Autowired TestService testService; 

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

サービス。

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

onfig.groovy:

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

あなたはまた、あなたのGrailsのクラスにしてJava/Scalaの豆を配線することができます

class TestController { 
    @Autowired 
    ServiceInjectionTester serviceInjectionTester 

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

参考文献:

Grails Reference 8.4 - Using Services from Java

Spring: The Foundation for Grails

+0

あなたはそれをどうするかの例を教えてください。 Spring用のXML設定も必要ですか? – Eduardo

+0

追加された例。 XMLは必要ありません。 – sourcedelica

関連する問題