2010-11-25 71 views
3

在我的配置的春/ resources.xml中的文件,我这样定义一个bean:清爽的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> 

在我的Config.groovy文件我有: remote.host = “someipaddress”

现在我想在运行时更改此占位符的值。在一个普通的春季应用程序中,我通过PropertyPlaceHolderConfigurer来完成此操作,然后刷新上下文并使其工作。

在Grails中,我该如何刷新上下文?

问候,

菲利普

+0

如果我没有得到你错了,你问如何刷新上下文(您可以随时重新启动服务器或重新部署应用程序 - 因为您不需要每天更改设置),但主要问题是如何在不重新编译的情况下替换remote.host。 - 那是对的吗? – robbbert 2010-11-27 13:13:33

+0

不是......它会随时随地动态替换remote.host,因为我将连接到托管在不同主机上的多个远程服务。 (是的,我知道maybie这不应该是一个单身人士,但这并不能解决我的刷新问题......) – Philippe 2010-11-27 15:14:53

回答

1

好吧,我放弃了令人耳目一新的方法。 作为一种变通方法,我创建了一个Grails的服务,看起来像这样:

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。

我仍然有兴趣在一个清洁的解决方案,因为这让我改写为每个远程方法的包装方法:-S

0

为什么不直接更新值:

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

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

这是真的,但在我的情况下,该bean实际上是一个动态代理(org.springframework.aop.framework。 JdkDynamicAopProxy),所以我没有直接访问代理接口的字段。 – Philippe 2010-11-26 10:33:58

0

grailsApplication暴露刷新()方法,我不是确定它是否会重新加载spring context,你可以试试。

+0

那么,grailsApplication。mainContext应该是可刷新的,但是我得到这个:2010-11-26 12:10:27,841 [http-8080-1] ERROR errors.GrailsExceptionResolver - GenericApplicationContext不支持多次刷新尝试:只调用'refresh'一次 java.lang .IllegalStateException:GenericApplicationContext不支持多刷新尝试,只要调用: '刷新' 一次 \t在ServiceUrlFilters $ _closure1_closure3_closure5.doCall(ServiceUrlFilters:33) \t在java.lang.Thread.run(Thread.java:680) – Philippe 2010-11-26 11:12:01

0

我在grails邮件列表中做了一个快速搜索,看起来像grails不支持app-context重载。

你可以尝试实现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

谢谢,但我的服务没有定义为我可以在我的应用程序中控制的Grails服务。这是一个部署在远程tomcat上的java服务,通过Hessian公开。在我的grails应用程序中,我只有服务接口,并通过HessianProxyFactoryBean配置了对远程服务的访问...... – Philippe 2010-11-26 15:14:41

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问题。