在resources.groovy中连接wsclient Webservices

时间:2011-09-08 11:34:58

标签: spring grails

我有一种情况需要能够在三种经典环境中挖掘数据: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()视为静态调用。我之前没有这样做过,但是......好好学习...... 求助于:

3 个答案:

答案 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.
}

有效。我希望接线工作,但我无法及时完成。