为什么Java Web服务客户端(CXF,JAX-WS,JDK1.6)在Grails应用程序中展示不同的行为?一个CLASSPATH修复?

时间:2010-08-12 17:34:07

标签: grails cxf grails-plugin

背景: 当前的Grails应用程序必须与“遗留”Web服务进行交互 来自第三方供应商 - (systinet)使用Apache CXF Wsdl2Java工具生成复杂类型和服务接口。 到目前为止非常标准的东西,这非常适合来自Java

在编写一些测试类和main()方法之后 练习Java代码,并在上面提供一个薄层 简化的界面,我想从Grails应用程序调用此代码。 具体来说,Grails控制器,服务,石英工作和 喜欢。然而,这是事情变得有趣的地方。

Grails CXF插件的第一个堆栈跟踪导致了FileNotFoundException。除了不需要加载WSDL定义 - 因为我已经成功运行了CXF的Wsdl2Java工具,似乎我在这里缺少一些东西。尝试用文件:/// url ***代替WSDL并获得另一个异常。

在所有这些的结尾 - 删除任何类型的插件,我手动重新配置了具有CXF依赖项的项目**现在得到了一个MarshallingException,主要来自CXF生成的代码!顺便说一下,从Java类中完美地执行。

我确信在您的Grails集成中一定遇到过这个问题。一如既往,您的指导非常感谢!

1)为什么在Grails应用程序中,运行时是否尝试解析wsdl?另外,请注意JDK版本与java版本“1.6.0_12”相同。

2)任何人都可以建议任何CLASSPATH解决方法吗?我想另一种方法是使用GroovyWS重新编写Java中间层调用,但这将是非常费力的 - 给定数量的服务和供应商已经出现的自定义类型。

static {
    URL url = null;
    try {
        url = new URL("http://mydevhost:9080/wasp/bmc-security/ctsa/person");
    } catch (MalformedURLException e) {
        System.err.println("Can not initialize the default wsdl from server");
        // e.printStackTrace();
    }
    WSDL_LOCATION = url;
}

/ * static {         URL url = null;         尝试{             url =新网址(“file:/// C:/Projects/beta/workspace/reqmgr3/wsdl/Person.wsdl”);             url.getPath();         } catch(MalformedURLException e){             System.err.println(“无法从文件系统初始化默认的wsdl”);             // e.printStackTrace();         }         WSDL_LOCATION = url;     } * /

`

****堆栈痕迹

  

信息:没有为Conduit配置信任决策者...   2010年8月11日下午6:26:16 org.apache.cxf.transport.http.HTTPConduit finalizeConfig   信息:没有为Conduit配置基本Auth供应商'...   2010年8月11日下午6:26:16 org.apache.cxf.transport.http.HTTPConduit准备   信息:分块设置为2048。   2010年8月11日下午6:26:16 org.apache.cxf.phase.PhaseInterceptorChain doIntercept   信息:拦截器抛出异常,现在解除   org.apache.cxf.interceptor.Fault:编组错误:com.systinet.wsdl.com.bmc.security.ess.webservice.holder.ArrayOfLog   inPairHolder在这种情况下是未知的           at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:132)           在org.apache.cxf.jaxb.io.XMLStreamDataWriter.write(XMLStreamDataWriter.java:42)           at org.apache.cxf.jaxb.io.XMLStreamDataWriter.write(XMLStreamDataWriter.java:30)           在org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:73)           在org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:148)           在org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:215)           在org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)           在org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:122)           在$ Proxy44.login(未知来源)   ...           ......还有2个

更新于8月15日:

出于模块化和权宜之计的决定,将此代码放入单独的WAR项目中,该项目将提供其有限公司。服务,而不是暴露原始供应商的Web服务,这些服务太笨重了。

这个项目将是纯Java,并利用Metro 2.0.1运行时,大约16mb。

在清除lib和src / java文件夹之后,现在可以从Grails调用基于Java的中间件服务 - 基本上只需安装ws-client插件并设置本地服务,如下所示:

import groovyx.net.ws.WSClient 
import org.grails.plugins.wsclient.service.WebService 

class LocalPersonService { 
    WebService webService 
    groovyx.net.ws.WSClient  _proxy 
    static final String PERSON_WSDL_URL = "http://localhost:9090/pri/PersonServicePort?wsdl" 

    def transactional = false 

    def getPersonDetails( String customerId, User userAccount, String userCredential ) { 
        // must cache the proxy 
        if ( _proxy == null ) { 
            print( "init proxy.  Parsing wsdl..." ) 
            try { 
                _proxy = webService.getClient(PERSON_WSDL_URL) 
            } 
            catch ( Throwable tr ) { println( tr.getMessage() ) } 
        } 

        // method shall return a  (com.siventures.example.service.PersonDetails) 
        return _proxy.getPersonDetails( customerId, userAccount, userCredential, ... ) 
    } 

0 个答案:

没有答案