我有一个 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绑定(bind):
@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>
为什么会这样以及如何强制客户以正确的方式行事?
更新
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
-方法将值作为输入并将它们包装在 JAXBElement
中具有相应的 XML 名称。所以当你使用createString
时,你实际上说你想要 string
作为元素名称。 String
在createString
用于元素名称,而不是值类型。
所以你的ObjectFactory
还应该有类似 createUID
的方法, createPWD
, createSignature
等等。使用这些方法而不是 createString
.
顺便问一下,你真的尝试过调试它吗?如果你看过 ObjectFactory
的源代码,整个故事就会非常明显。 ,有什么理由避免这种情况?
关于java - SOAP、JAXB 编码行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40465547/