2010-11-25 1 views
3

は私の設定の春/ resources.xmlファイルでは、私はこのような豆定義:私のConfig.groovyファイルでリフレッシュGrailsはApplicationContextの

<bean id="myService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> 
    <property name="serviceUrl" value="http://${remote.host}:8080/MyAgent/remoting/MyService"/> 
    <property name="serviceInterface" value="services.MyService"/> 
</bean> 

を私が持っている: remote.host = "someipaddress"

これで、実行時にこのプレースホルダの値を変更したいと思います。通常のSpringアプリケーションでは、PropertyPlaceHolderConfigurerを使用してこれを行い、コンテキストを更新して動作させます。

Grailsでは、どのようにコンテキストを更新できますか?

よろしく、

フィリップ

+0

は、あなたがコンテキストを更新する方法を求めている:これは私が各リモートメソッドのラッパーメソッドを書き換えますよう

は、私はまだクリーンなソリューションに興味があります毎回設定を変更しないので、いつでもサーバを再起動したり、アプリケーションを再デプロイできますが、主な問題は再コンパイルせずに 'remote.host'を置き換える方法です。 - あれは正しいですか? – robbbert

+0

いいえ...別のホストでホストされているいくつかのリモートサービスに接続するので、いつでもremote.hostを動的に置き換えることができます。 (これはシングルトンではないはずですが、それは私のリフレッシュの問題を解決しません...) – Philippe

答えて

1

私は爽やかなアプローチをあきらめます。

class myService { 
    def myRemoteService 
    static transactional = false 

    private MyRemoteService getService(String remoteServiceURL) { 
     HessianProxyFactory factory = new HessianProxyFactory(); 
     try { 
      return (MyRemoteService) factory.create(MyRemoteService.class, url); 
     } 
     catch (MalformedURLException e) { 
      e.printStackTrace() 
     } 
     return null 
    } 

    def someRemoteMethod(String remoteServiceURL) { 
     getService(remoteServiceURL).myRemoteMethod() 
    } 
} 

これは私がdinamicallyどんな遠くのマシンにリモートサービスを呼び出すことができます。 回避策として、私はこのようになりますGrailsのサービスを作成しました。 (私はあなたが間違って取得していない場合は、-S

0

が理由だけで直接値を更新しない:

def blabla 
... 
void someServiceMethod() { 
    blabla.someProperty = 'new value' 
} 

または

def blabla 
... 
def someControllerAction = { 
    blabla.someProperty = 'new value' 
} 
+0

私の場合、Beanは実際には動的プロキシです。 JdkDynamicAopProxy)、私はプロキシされたインターフェイスのフィールドに直接アクセスする必要はありません。 – Philippe

0

grailsApplicationは、refresh()メソッドを公開、私はないんだけどそれが春のコンテキストを再読み込みする場合は、あなたが試みることができます。

+0

さて、grailsApplicationです。mainContextは更新可能でなければなりませんが、次のようになります:2010-11-26 12:10:27,841 [http-8080-1]エラーerrors.GrailsExceptionResolver - GenericApplicationContextは複数のリフレッシュをサポートしていません。 .IllegalStateException:GenericApplicationContextは、複数のリフレッシュの試行をサポートしていません。ただ(ServiceUrlFilters:33)ServiceUrlFilters $ _closure1_closure3_closure5.doCallで \tたら、 'リフレッシュ' と呼ぶjava.lang.Thread.run(Thread.java:680) – Philippe

0

私はgrailsメーリングリストですばやく検索しましたが、grailsはアプリコンテキストリロードをサポートしていないようです。

InitializingBeanを実装して、app configから直接値を取得できます。

import org.springframework.beans.factory.InitializingBean 

class ExampleService implements InitializingBean { 

    def grailsApplication 
    def setting 

    void afterPropertiesSet() { 
     this.setting = grailsApplication.config.setting 
    } 
} 

たぶん、あなたは、設定の変更を聴いたり、財産にあなたがそれを使用する必要があるたびに取得することができ、私は今、いくつかのテストを実行するためのアプリケーションを作成することはできません、知りません。

+0

おかげで \t、私のアプリケーションは、自分のアプリケーションで制御できるGrailsサービスとして定義されていません。これは、Hessianを介して公開されているリモートのtomcatに配置されたJavaサービスです。私のgrailsアプリケーションでは、私はサービスインタフェースしか持たず、HessianProxyFactoryBeanを通してリモートサービスへのアクセスを設定します... – Philippe

0

テストされていないが、試してみてください。

import grails.spring.BeanBuilder 

def bb = new BeanBuilder(
     application.parentContext, 
     new GroovyClassLoader(application.classLoader)) 
def beans = bb.beans { 
    myService(org.springframework.remoting.caucho.HessianProxyFactoryBean) { 
     ... 
    } 
} 
beans.registerBeans(application.mainContext) 

をこれは、彼らが新しいBeanインスタンスに交換する必要があるときに何をすべきかのプラグインはかなりあります。これを行うためのより良い方法については、JIRAの問題を提起することもできます。

+0

実行時にコンテキストをリフレッシュできるという点でこのアプローチの違いは何ですか? – Philippe

+0

2つの違い: 1.与えられたID のためにまったく新しい豆を登録することができます。2.それは動作しますが、.refresh()は明らかにそれをテストしませんでした。 –

関連する問題