簡體   English   中英

在resources.groovy中連接wsclient Web服務

[英]Wiring wsclient Webservices in resources.groovy

我遇到的情況是,我需要能夠在三個經典環境中將數據挖掘下來:dev,itg和CAT。 我的Web服務控制器中有工作代碼,但由於兩個原因,現在將該邏輯分解為自己的服務。 首先,要分開關注點,其次是更好的性能。 將Webservice初始化保留在控制器中意味着每次從控制器調用wsdl到groovy對象的轉換都會重復一次,這是不理想的。

但是,在嘗試將它們連接在一起時,我總是收到初始化錯誤。

spring.GrailsRuntimeConfigurator [RuntimeConfiguration] Unable to load beans from resources.groovy
org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: static org.grails.plugins.wsclient.service.WebService.getClient() is applicable for argument types: (java.lang.String) values: [WSDL-LOCATION-HERE]
Possible solutions: getClient(java.lang.String), getClient(java.lang.String, groovyx.net.ws.cxf.SoapVersion), getClass(), getAt(java.lang.String)

令人反感的代碼是:

// Place your Spring DSL code here
import org.grails.plugins.wsclient.service.WebService;
beans = {

    itgFilenetService(testbed.webservices.FileNetService) { 
        wsdlLocation = "WSDL-LOCATION-HERE"
        webService = WebService.getClient(wsdlLocation)
    }

//  FileNetController(testbed.webservices){
//      fileNet = itgFilenetService
//  }

}

我知道我在這里做錯了什么,因為顯然... WebService.getClient(String)過去已經是合法的構造器了……我想念的是什么?

我在這里嘗試提出建議:

def ib = [

    afterPropertiesSet:{
        itgWebService = WebService.getClient("WSDL")
        catWebService = WebService.getClient("WSDL")
        }

    ] as InitializingBean

但是此代碼從未在運行時被調用。
我意識到(現在),一個大問題是將Webservice.getClient()視為靜態調用。 我以前沒有做過,但是很好...邊做邊學...解決了以下問題:

有兩種方法可以解決您的問題。

首先,嘗試在服務上實現InitializingBean ,然后將代碼移入afterPropertiesSet()。 我懷疑這將解決您的問題,並為您提供更清潔的實施方案。

但是,如果由於某種原因無法正常工作(也許某種程度上該插件的資源不可用,盡管那時應該已經全部可用),則可以隨時將代碼移至Bootstrap.groovy中。

我建議嘗試第一種選擇。

根據ws-client插件的文檔(http://www.grails.org/plugin/ws-client),.getClient(String)不是靜態方法,因此您需要在WebService對象上調用它,而不是班級。 那就是MME的來源。

如果要在resources.groovy中執行此操作,請嘗試使用Spring的MethodInvokingFactoryBean

webService(org.grails.plugins.wsclient.service.WebService)

parsedWsdlWSClient(org.springframework.beans.factory.config.MethodInvokingFactoryBean) {
    targetObject = ref('webService')
    targetMethod = 'getClient'
    arguments = ["WSDL-LOCATION-HERE"]
}

itgFilenetService(testbed.webservices.FileNetService) { 
    webService = ref('parsedWsdlWSClient')
}

注意,那么, itgFilenetService.webService將是一個實例WSClient ,不WebService

或者,如果您想利用Grails自動裝配,可以將def parsedWsdlWSClient添加到需要它的Grails服務中,並跳過resources.groovy中的分配步驟。

解:

根本不是采用“ grails-y”方式,而是因為即使在意識到靜態調用的錯誤之后,我也無法自動裝配才能工作,所以我需要做一些事情。

我最終將常規代碼拖入Java類,然后在服務中引用了它。

服務代碼:

    static class FileNetService {
         FilenetUtils fu = new FilenetUtils();
         // methods
    }

FilenetUtils:

導入groovyx.net.ws.WSClient;

導入org.grails.plugins.wsclient.service.WebService;

public class FilenetUtils {
    WebService webService = new WebService();

    private static groovyx.net.ws.WSClient itgWebService = null; 
    private static groovyx.net.ws.WSClient catWebService = null;

FilenetUtils()  {
        itgWebService = (WSClient) webService.getClient(FILENET_ITG_URL);
        catWebService = (WSClient) webService.getClient(FILENET_CAT_URL);
    }
//More methods, etc.
}

有用。 我想布線,但是我無法及時完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM