WSDL客户端生成不完整?

时间:2012-06-11 16:48:41

标签: web-services wsdl tibco xfire

尝试从WSDL文件生成Java客户端生成(使用XFire使用XMLBeans绑定)

我能够生成客户端+故障消息(无错误),但是没有生成输入消息和输出消息,它也没有在客户端生成操作。我的WSDL文件有什么问题,或者我有什么遗漏?

更新:

  1. 我更新了我的测试XFire项目here

  2. 我开始怀疑问题可以归结为WSDL(因为我可以成功生成其他WSDL)。我发现了这些警告,我感到很相关:

      

    WS-I:(BP2402)wsdl:binding元素不使用a   soapbind:“3 SOAP绑定”一节中定义的绑定元素。的   WSDL 1.1规范。

         

    WS-I:(BP2032)有缺陷的soapbind:fault元素:“name”属性值与“name”属性的值不匹配   父元素wsdl:fault。

         

    WS-I:(AP2901)描述既不使用WSDL 1.1第5节中描述的WSDL MIME绑定,也不使用WSDL SOAP绑定中所描述的   WSDL 1.1关于每个wsdl:input或wsdl:output元素的第3节   一个wsdl:binding。

  3. 刚发现soap12可能导致了这个问题。如果我将xmlns:soap =“http://schemas.xmlsoap.org/wsdl/soap12/”更改为xmlns:soap =“http://schemas.xmlsoap.org/wsdl/soap/”并在soap中删除soapActionRequired :操作它可以成功生成客户端。但是webservice目前仅在soap1.2中。因此,更改wsdl以使用soap1.1并非如此。

  4. 这是我的WSDL文件:

    <!--Created by TIBCO WSDL-->
    <wsdl:definitions xmlns:tns="http://schemas.ocbc.com/soa/WSDL/service/CBS-CustAccountInfo-I" xmlns:soap1="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:jndi="http://www.tibco.com/namespaces/ws/2004/soap/apis/jndi" xmlns:ns="http://schemas.ocbc.com/soa/emf/common/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:jms="http://www.tibco.com/namespaces/ws/2004/soap/binding/JMS" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="Untitled" targetNamespace="http://schemas.ocbc.com/soa/WSDL/service/CBS-CustAccountInfo-I">
    
    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.ocbc.com/soa/emf/common/envelope/" elementFormDefault="qualified" attributeFormDefault="unqualified">
            <xs:include schemaLocation="../Schemas/XML/CBS-CustAccountInfo-I-ServiceEnvelope.xsd"/>
        </xs:schema>
    </wsdl:types>
    <wsdl:service name="CBS-CustAccountInfo-I">
        <wsdl:port name="CBS-CustAccountInfo-I_HTTP" binding="tns:CBS-CustAccountInfo-I_HTTPBinding">
            <soap:address location="https://localhost:15038/Services/CBS-CustAccountInfo-I/Processes/MainRequestResponse_HTTP"/>
        </wsdl:port>
    </wsdl:service>
    <wsdl:portType name="PortType">
        <wsdl:operation name="CBS-CustAccountInfo-I">
            <wsdl:input message="tns:InputMessage"/>
            <wsdl:output message="tns:OutputMessage"/>
            <wsdl:fault name="fault1" message="tns:FaultMessage"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="CBS-CustAccountInfo-I_HTTPBinding" type="tns:PortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="CBS-CustAccountInfo-I">
            <soap:operation style="document" soapAction="/Services/CBS-CustAccountInfo-I/Processes/MainRequestResponse_HTTP" soapActionRequired="true"/>
            <wsdl:input>
                <soap:body use="literal" parts="InputMessage"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" parts="OutputMessage"/>
            </wsdl:output>
            <wsdl:fault name="fault1">
                <soap:fault use="literal" name="fault1"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:message name="InputMessage">
        <wsdl:part name="InputMessage" element="ns:ServiceEnvelope"/>
    </wsdl:message>
    <wsdl:message name="OutputMessage">
        <wsdl:part name="OutputMessage" element="ns:ServiceEnvelope"/>
    </wsdl:message>
    <wsdl:message name="FaultMessage">
        <wsdl:part name="FaultMessage" element="ns:ServiceEnvelope"/>
    </wsdl:message>
    </wsdl:definitions>
    

    这是我的蚂蚁任务:

    <!-- Generating XML Beans -->   
    <target name="gen-xmlbeans">
    <java classname="org.apache.xmlbeans.impl.tool.SchemaCompiler"
              classpathref="build.classpath"
              fork="true">
          <arg value="-out"/>
          <arg value="${basedir}/lib/ocbc.jar"/>
          <arg value="${schema.path}"/>
    </java>
    </target>
    
    <!-- Generating Client -->
    <target name="ws-generate">
            <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask">
                <classpath>
                    <fileset dir="${lib.dir}" includes="*.jar" />
                </classpath>    
            </taskdef>    
            <wsgen outputDirectory="${basedir}/src/" wsdl="${wsdl.path}" package="test.client" overwrite="true" binding="xmlbeans"/>                
    </target>
    

    生成的客户端:

    public class CBS_CustAccountInfo_IClient {
    
    private static XFireProxyFactory proxyFactory = new XFireProxyFactory();
    private HashMap endpoints = new HashMap();
    
    public CBS_CustAccountInfo_IClient() {
    }
    
    public Object getEndpoint(Endpoint endpoint) {
        try {
            return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());
        } catch (MalformedURLException e) {
            throw new XFireRuntimeException("Invalid URL", e);
        }
    }
    
    public Object getEndpoint(QName name) {
        Endpoint endpoint = ((Endpoint) endpoints.get((name)));
        if ((endpoint) == null) {
            throw new IllegalStateException("No such endpoint!");
        }
        return getEndpoint((endpoint));
    }
    
    public Collection getEndpoints() {
        return endpoints.values();
    }
    
    }
    

1 个答案:

答案 0 :(得分:1)

@Rudy如果你必须使用XFire,你可以考虑尝试其他绑定,例如JAXB绑定,看看你是否能够正确生成代码。