2012-06-11 163 views
4

只是试图(使用XFire的使用XMLBeans的结合)WSDL客户端生成不完整?

我能够生成客户端+故障信息(没有错误)从WSDL文件生成Java客户端产生,但是没有产生输入消息和输出消息,这是也不会在客户端生成操作。我的WSDL文件有什么问题吗?或者有什么我错过了?

更新:

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

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

    WS-I:(BP2402)的WSDL:binding元素不使用 的soapbind:如在部分中定义的结合元件 “3 SOAP绑定”。 WSDL 1.1规范。

    WS-I:(BP2032)有缺陷的soapbind:fault元素:“name”属性值与 父元素wsdl:fault上的“name”属性值不匹配。描述既不使用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 :操作它可以成功地生成客户端。但是web服务目前仅在soap1.2中。所以改变wsdl使用soap1.1并不是这里的情况。

这里是我的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> 

,这里是我的Ant任务生成:

<!-- 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(); 
} 

} 
+0

XFire是旧的,非标准的和不受支持的。你可能会对它的继任者Apache CXF感到高兴。 – bmargulies

+0

我知道,太糟糕了,我不得不使用这个。 – Rudy

回答

1

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

+0

我们尝试使用JAXB,并且我们遇到了重复元素的另一个问题(因为模式引用了对方)。 – Rudy

+0

@Rudy你是说有多个模式,其中一些引用对方?在这种情况下,你可能会合并那些相互引用的模式。这可能是导致XMLBeans无法正确生成的相同问题。 – Wins

+0

XMLBeans生成成功(并且可以在SOAP 1.1中使用) – Rudy