我有一个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>


为什么会这样,以及如何迫使客户以正确的方式行事?

更新资料
凭据对象是这样创建的(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元素的名称。 ObjectFactory / wsimport生成的xjc通常包含生成此类JAXBElement实例的方法。这些createFoo方法将值作为输入,并将它们包装在带有相应XML名称的JAXBElement中。因此,当您使用createString时,实际上是说您想要string作为元素名称。 String中的createString用于元素名称,而不用于值类型。

因此,您的ObjectFactory还应具有createUIDcreatePWDcreateSignature等方法。请使用这些方法代替createString

顺便说一句,您实际上尝试过调试吗?如果您看过ObjectFactory的源代码,那么整个故事将非常明显,有什么理由避免这种情况?

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

10-08 22:47