2016-11-07 80 views
0

我有一個WSDL規範,使用wsimport來生成客戶端代碼。 (就像我以前做過很多次那樣)。現在SOAP,JAXB編組行爲

,在XSD類型之一:

<xs:complexType name="Credential"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="UID" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="UIDBranch" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="PWD" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="Signature" nillable="true" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 

和相應的Java綁定:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Credential", namespace = "http://schemas.datacontract.org/2004/07/...", propOrder = { 
    "uid", 
    "uidBranch", 
    "pwd", 
    "signature" 
}) 
public class Credential { 

    @XmlElementRef(name = "UID", namespace = "http://schemas.datacontract.org/2004/07/...", type = JAXBElement.class, required = false) 
    protected JAXBElement<String> uid; 
    @XmlElementRef(name = "UIDBranch", namespace = "http://schemas.datacontract.org/2004/07/...", type = JAXBElement.class, required = false) 
    protected JAXBElement<String> uidBranch; 
    @XmlElementRef(name = "PWD", namespace = "http://schemas.datacontract.org/2004/07/...", type = JAXBElement.class, required = false) 
    protected JAXBElement<String> pwd; 
    @XmlElementRef(name = "Signature", namespace = "http://schemas.datacontract.org/2004/07/...", type = JAXBElement.class, required = false) 
    protected JAXBElement<String> signature; 

    ... the rest: getters/setters 

當在請求了這種類型的元件發生看起來像:

<ns2:Credentials> 
    <ns4:string>login</ns4:string> 
    <ns4:string>password</ns4:string> 
    <ns4:string>signature</ns4:string> 
</ns2:Credentials> 

但它丟失了類型內的元素名稱,上面的片段應該是這樣的:

<ns2:Credentials>                
    <ns4:UID>login</ns4:UID>                
    <ns4:PWD>password</ns4:PWD>                
    <ns4:Signature>signature</ns4:Signature> 
</ns2:Credentials> 

爲什麼會這樣以及如何強制客戶端以正確的方式運行?

更新 憑證對象像這樣創建(ofObjectFactory):

Credential cr = of.createCredential() 
cr.setUID(of.createString(login)) 
cr.setPWD(of.createString(password)) 
cr.setSignature(of.createString(sign)) 
+0

你如何構造'Credentials'對象? – lexicore

+0

@lexicore更新問題 – dmitry

回答

1

你得到

<ns4:string>login</ns4:string> 

因爲你用of.createString(login)。如果你想要ns4:UID,請使用類似of.createUID(...)的東西。

事情是,JAXBElement<String>有一個字符串值(例如登錄),但也有元素的名稱(分別爲getValue()getName())。這個名字是XML元素的名字。 wsimport/xjc生成的ObjectFactory通常包含生成此類實例的方法。這些方法將值作爲輸入,並將它們用JAXBElement與相應的XML名稱包裝在一起。所以當你使用createString時,你實際上說你想要string作爲元素名稱。 String in createString用於元素名稱,不用於值類型。

所以你ObjectFactory也應該有方法,如createUIDcreatePWDcreateSignature等。使用這些方法而不是createString

順便說一句,你真的嘗試過調試嗎?如果你看過ObjectFactory的源代碼,那麼有什麼理由要避免這個問題呢?

+0

萬歲,非常感謝! – dmitry