2013-05-30 22 views
1

我已經閱讀了很多關於在運行時切換多個數據源的信息,但據我所知他們已經定義了數據源。我不太確定我如何才能從web服務調用中對運行時的數據源屬性進行賦值。Grails:從webservice創建我的數據源

我不需要在數據源之間切換,只需要創建一個數據源並使用來自web服務的連接數據。 有沒有辦法從web服務中檢索這些參數並從中創建數據源?

這裏的策略是從web服務中爲所有項目檢索數據源參數,這樣連接數據不在文件內部或代碼中,只能由DBA從全局安全應用程序操縱。

我試圖在相同的數據源文件中調用Web服務,但它沒有工作。

信息:
Web服務是一個SOAP
Web服務 的Grails:1.3.9

問候。

回答

0

我認爲你可以創建一個BeanPostProcessor,負責調用你的webservice並改變你的dataSource的設置。

可能您需要delay the session factory creation,確保Grails在所有設置正確之前不會嘗試使用您的數據源。

了BeanPostProcessor將看起來像:

class WebserviceDataSourceBeanPostProcessor implements BeanPostProcessor { 
    Object postProcessBeforeInitialization(Object bean, String beanName) { 
     return bean 
    } 

    Object postProcessAfterInitialization(Object bean, String beanName) { 

     if (bean instanceof DataSource){ 
      def info = //call webservice here... 
      bean.username = info.username 
      bean.password = info.password 
      bean.url = info.url 
      //checkout more setters in: http://commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html 
     } 

     return bean 
    } 
} 

並確保您在resources.groovy

beans = { 
    webserviceDataSourceBeanPostProcessor(WebserviceDataSourceBeanPostProcessor) 
} 

宣佈今年春天豆如果你將與此相同的配置多個項目從一個web服務來的,你可能認爲這是一個插件的可能性,重用你的代碼。

+0

他希望應用程序成爲Web服務的「生產者」,這樣DBA就可以「消費」它並向他發送有關數據源的所需信息並最終將其設置爲配置。 – dmahapatro

+0

Ohhhh。我認爲你是對的。我誤解了這個問題。應用程序必須調用通用的Web服務來獲取憑據和數據庫信息。是的,BeanPostProcessor是要走的路。 – dmahapatro

+0

@dmahapatro OP說:「我不太確定我怎麼才能從web服務調用中對運行時的數據源屬性進行賦值」。我假設從webservice返回的連接屬性可以隨時更改,他想要選擇它並配置他的數據源,而不是在config.groovy中設置它,因爲他說「運行時」。 –