java - SOAP、JAXB 编码行为

标签 java soap jaxb wsimport

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

相关文章:

java - 错误 : Could not find or load main class org. apache.catalina.startup.Bootstrap

java - 为什么我的文本文件总是空的?

java - 在 marklogic 中搜索文档时按指定条件设置分页

spring - 无法使用 apache cxf 在 Apache tomcat 中部署项目

java - Unmarshal 在具有 List<T> 字段的泛型上生成空字段

java - 无法让 Ajax 工作。这与附加的配置有关吗?

web-services - 命名空间中所需的 WSDL 扩展元素 'binding'

java - SOAP - PKIX 路径构建失败

java - 将 JAXB 与包含许多相同元素的 XML 文件一起使用

ant - schemagen ant 任务忽略 package-info.java