我有一个WSDL规范,使用wsimport
生成客户端代码。 (因为我之前已经做过很多次)。
现在,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>
为什么会这样,以及如何迫使客户以正确的方式行事?
更新资料
凭据对象是这样创建的(
of
是ObjectFactory
):Credential cr = of.createCredential()
cr.setUID(of.createString(login))
cr.setPWD(of.createString(password))
cr.setSignature(of.createString(sign))
最佳答案
你得到
<ns4:string>login</ns4:string>
因为您使用
of.createString(login)
。如果要使用of.createUID(...)
,请使用类似ns4:UID
的名称。问题是,
JAXBElement<String>
具有字符串值(例如,登录名),但还具有元素的名称(分别为getValue()
和getName()
)。此名称是XML元素的名称。 ObjectFactory
/ wsimport
生成的xjc
通常包含生成此类JAXBElement
实例的方法。这些createFoo
方法将值作为输入,并将它们包装在带有相应XML名称的JAXBElement
中。因此,当您使用createString
时,实际上是说您想要string
作为元素名称。 String
中的createString
用于元素名称,而不用于值类型。因此,您的
ObjectFactory
还应具有createUID
,createPWD
,createSignature
等方法。请使用这些方法代替createString
。顺便说一句,您实际上尝试过调试吗?如果您看过
ObjectFactory
的源代码,那么整个故事将非常明显,有什么理由避免这种情况?关于java - SOAP,JAXB编码行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40465547/