2012-11-22 112 views
5

在一個Java項目中,我使用jax-ws和wsdl創建了一個webservice客戶端。該請求是有效的XML,但缺少此特定肥皂調用中所需的前綴。目前我通過手動將xmlns = {@ javax.xml.bind.annotation.XmlNs(prefix =「gen」,namespaceURI =「http:// schemas ...」)})添加到package-info.java類但是感覺這不是最好的解決方案,因爲包信息是自動創建的,如果由於某種原因再次生成源,我的解決方案將被覆蓋。使用jax-ws在肥皂請求中缺少前綴

我懷疑我的wsdl中缺少一些東西。

這裏的WSDL:

<?xml version="1.0" encoding="UTF-8"?> 
    <wsdl:definitions xmlns:tns="http://xmlns.example.com/1308658932768" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns0="http://schemas.triennium.com/Servicepunt/gen" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="Untitled" targetNamespace="http://xmlns.example.com/1308658932768"> 
     <wsdl:types> 
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://schemas.triennium.com/Servicepunt/gen" 
    targetNamespace="http://schemas.triennium.com/Servicepunt/gen" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 
      <xs:element name="CallInfo"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="ResponseStatus"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="Credentials"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="AuthenticateAannemerRequest"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="AuthenticateAannemerResponse"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
    </wsdl:types> 
    <wsdl:service name="WSDL_Generator.2.0.2"> 
     <wsdl:port name="AuthenticateAannemer.2.0.2" binding="tns:AuthenticateAannemer.2.0.2Binding"> 
      <soap:address location="http://10.11.2.12:2592"/> 
     </wsdl:port> 
    </wsdl:service> 
    <wsdl:portType name="AuthenticateAannemer"> 
     <wsdl:operation name="AuthenticateAannemer"> 
      <wsdl:input message="tns:AuthenticateAannemerRequest"/> 
      <wsdl:output message="tns:AuthenticateAannemerResponse"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="AuthenticateAannemer.2.0.2Binding" type="tns:AuthenticateAannemer"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="AuthenticateAannemer"> 
      <soap:operation style="document" soapAction="/AuthenticateAannemer.2.0.2/AuthenticateAannemer"/> 
      <wsdl:input> 
       <soap:body use="literal" parts="input"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal" parts="output"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:message name="AuthenticateAannemerRequest"> 
     <wsdl:part name="input" element="ns0:AuthenticateAannemerRequest"/> 
    </wsdl:message> 
    <wsdl:message name="AuthenticateAannemerResponse"> 
     <wsdl:part name="output" element="ns0:AuthenticateAannemerResponse"/> 
    </wsdl:message> 
</wsdl:definitions> 

這裏是沒有前綴的要求:

<?xml version='1.0' encoding='UTF-8'?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <AuthenticateAannemerRequest xmlns="http://schemas.triennium.com/Servicepunt/gen"> 
      <CallInfo> 
       <Customer>...</Customer> 
       <Module>...</Module> 
       <Version>...</Version> 
      </CallInfo> 
      <Credentials> 
       <Username>...</Username> 
       <Password>...</Password> 
      </Credentials> 
     </AuthenticateAannemerRequest> 
    </S:Body> 
</S:Envelope> 

這裏的要求,我希望它是:

<?xml version='1.0' encoding='UTF-8'?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <gen:AuthenticateAannemerRequest xmlns:gen="http://schemas.triennium.com/Servicepunt/gen"> 
      <gen:CallInfo> 
       <gen:Customer>...</Customer> 
       <gen:Module>...</Module> 
       <gen:Version>...</Version> 
      </gen:CallInfo> 
      <gen:Credentials> 
       <gen:Username>...</Username> 
       <gen:Password>...</Password> 
      </gen:Credentials> 
     </gen:AuthenticateAannemerRequest> 
    </S:Body> 
</S:Envelope> 

編輯:添加前綴在第二個例子中的命名空間聲明,它是在那裏開始的,但是在c/p代碼時以某種方式丟失了。

+5

對於XML解析器或soap實現,兩個請求應該是相同的。前綴在XML中沒有意義,重要的是命名空間和名稱的本地部分。在第二個示例中,前綴「gen」實際上並不綁定到任何名稱空間,這應該是無效的。如果你打算使用'xmlns:gen'只是'xmlns',那麼這兩個請求應該得到相同的處理。 –

回答

0
@XmlRootElement(namespace = "http://schemas.triennium.com/Servicepunt/gen") 
public class AuthenticateAannemerRequest implements Serializable { 

    private CallInfo callInfo; 
    private Credentials credentials; 

    public AuthenticateAannemerRequest() { 
    } 

    @XmlElement(namespace = "http://schemas.triennium.com/Servicepunt/gen") 
    public CallInfo getCallInfo() { 
     return callInfo; 
    } 

    public void setCallInfo(CallInfo callInfo) { 
     this.callInfo = callInfo; 
    } 

    @XmlElement(namespace = "http://schemas.triennium.com/Servicepunt/gen") 
    public Credentials getCredentials() { 
     return credentials; 
    } 

    public void setCredentials(Credentials credentials) { 
     this.credentials = credentials; 
    } 
} 
0

您需要手動編譯package-info.java成類文件。

0

如果您從模式生成類,則可以添加JAXB綁定文件。

查看此answer以獲取該文件的模板,該模板指定模式缺省名稱空間的前綴。

然後在使用genration工具時指定其他綁定文件。

編輯你會用會

一個例子文件:

<?xml version="1.0"?> 
<jxb:bindings version="1.0" 
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd 
       http://jaxb2-commons.dev.java.net/namespace-prefix http://java.net/projects/jaxb2-commons/sources/svn/content/namespace-prefix/trunk/src/main/resources/prefix-namespace-schema.xsd"> 

    <jxb:bindings> 
     <jxb:schemaBindings> 
      <jxb:package name="your-package-name-here" /> 
     </jxb:schemaBindings> 
     <jxb:bindings> 
      <namespace:prefix name="http://schemas.triennium.com/Servicepunt/gen" /> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

記住生成的類時要使用的jaxb-commons插件。