我有一种情况需要能够在三种经典环境中挖掘数据:dev,itg和CAT。我在我的webservice控制器中有工作代码,但现在我将这个逻辑分解为自己的服务有两个原因。首先,将问题分开,其次是提高绩效。在控制器中保持web服务初始化意味着每次调用控制器时都会重复从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()视为静态调用。我之前没有这样做过,但是......好好学习...... 求助于:
答案 0 :(得分:0)
解决问题的两个选项。
首先,尝试在服务上实现InitializingBean并将代码移到afterPropertiesSet()中。我怀疑这将解决您的问题并为您提供更清晰的实施。
但是,如果由于某种原因不起作用(也许某种程度上该插件的资源不可用,尽管它们应该在那时完成),您可以随时将代码移动到Bootstrap.groovy。
我建议尝试第一个选项。
答案 1 :(得分:0)
从ws-client插件(http://www.grails.org/plugin/ws-client)上的文档中,.getClient(String)不是静态方法,因此需要在{ {1}}对象,而不是类。这就是MME的来源。
如果您想在resources.groovy中执行此操作,请尝试使用Spring中的WebService
:
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
。
或者,如果您想利用Grails自动装配,可以将WebService
添加到需要它的Grails服务中,并跳过resources.groovy中的分配步骤。
答案 2 :(得分:0)
解决方案:
完全不是“grails-y”的方式,但由于我无法自动工作 - 即使在意识到静态调用的错误之后 - 我需要做一些事情。
我最终将groovy代码拉入java类,然后在服务中引用它。
服务代码:
static class FileNetService {
FilenetUtils fu = new FilenetUtils();
// methods
}
FilenetUtils:
导入groovyx.net.ws.WSClient;
import 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.
}
有效。我希望接线工作,但我无法及时完成。