Освежающий Grails applicationContext - PullRequest
3 голосов
/ 25 ноября 2010

В файле моей конфигурации spring / resources.xml я определяю bean-компонент следующим образом:

<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 как обновить контекст?

С уважением,

Филипп

Ответы [ 5 ]

1 голос
/ 30 ноября 2010

Хорошо, я отказываюсь от освежающего подхода. В качестве обходного пути я создал сервис 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()
    }
}

Это позволяет мне динамически вызывать удаленный сервис на любом удаленном компьютере.

Я все еще заинтересован в более чистом решении, поскольку это заставляет меня переписывать метод-обертку для каждого удаленного метода: -S

0 голосов
/ 29 ноября 2010

Не проверено, но попробуйте:

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 голосов
/ 26 ноября 2010

grailsApplication предоставляет метод refresh (), я не уверен, перезагрузит ли он весенний контекст, вы можете попробовать.

0 голосов
/ 26 ноября 2010

Я сделал быстрый поиск в списке рассылки Grails, и похоже, что Grails не поддерживает перезагрузку контекста приложения.

Вы можете попробовать реализовать InitializingBean и получить значения напрямую из конфигурации приложения.

import org.springframework.beans.factory.InitializingBean

class ExampleService implements InitializingBean { 

   def grailsApplication 
   def setting

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

Возможно, вы можете прослушивать изменения в конфигурации или получать свойство каждый раз, когда вам нужно его использовать,я не знаю, я не могу создать приложение для запуска некоторых тестов прямо сейчас.

0 голосов
/ 26 ноября 2010

Почему бы просто не обновить значение напрямую:

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

или

def blabla
...
def someControllerAction = {
   blabla.someProperty = 'new value'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...