gpt4 book ai didi

java - SOAP、JAXB 编码行为

转载 作者:行者123 更新时间:2023-12-01 09:17:07 25 4
gpt4 key购买 nike

我有一个 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 对象是这样创建的(ofObjectFactory):

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 元素的名称。 ObjectFactorywsimport 生成/xjc通常包含生成此类 JAXBElement 的方法实例。这些createFoo -方法将值作为输入并将它们包装在 JAXBElement 中具有相应的 XML 名称。所以当你使用createString时,你实际上说你想要 string作为元素名称。 StringcreateString用于元素名称,而不是值类型。

所以你的ObjectFactory还应该有类似 createUID 的方法, createPWD , createSignature等等。使用这些方法而不是 createString .

顺便问一下,你真的尝试过调试它吗?如果你看过 ObjectFactory 的源代码,整个故事就会非常明显。 ,有什么理由避免这种情况?

关于java - SOAP、JAXB 编码行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40465547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com