![](/img/trans.png)
[英]How to access the ServletContext in resources.groovy for Grails 3?
[英]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.