在Jax-WS中解组可选参数

时间:2015-02-17 07:09:50

标签: java soap jaxb jax-ws

在soap UI中,我使用以下请求,一切正常:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_0="http://types.kamal.com/5_0/">
   <soapenv:Header/>
   <soapenv:Body>
      <_0:getNumberOfMatches>
         <Id>XXX</Id>
         <erPassword>XXX</erPassword>
         <name>KOL</name>
     <timing>
         <start>XXXX</start>
     </timing>      
      </_0:getNumberOfMatches>
   </soapenv:Body>
</soapenv:Envelope>

如果我在根级别<abc>1</abc>传递一个元素,它仍然可以正常工作。请求变成这样。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_0="http://types.kamal.com/5_0/">
   <soapenv:Header/>
   <soapenv:Body>
      <_0:getNumberOfMatches>
         <Id>XXX</Id>
         <erPassword>XXX</erPassword>
         <name>KOL</name>
     <timing>
         <start>XXXX</start>
     </timing>
     <abc>1</abc>   
      </_0:getNumberOfMatches>
   </soapenv:Body>
</soapenv:Envelope>

但是,如果我在时间元素下添加此标记<abc>1</abc>,则会开始向我提供非编组异常。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_0="http://types.kamal.com/5_0/">
   <soapenv:Header/>
   <soapenv:Body>
      <_0:getNumberOfMatches>
         <Id>XXX</Id>
         <erPassword>XXX</erPassword>
         <name>KOL</name>
     <timing>
         <start>XXXX</start>
         <abc>1</abc>
     </timing>      
      </_0:getNumberOfMatches>
   </soapenv:Body>
</soapenv:Envelope>

如果有人对JAX-WS使用的Unmarshalling机制有任何想法。 为什么它在父级别工作,并且在嵌套标记的情况下停止工作。

1 个答案:

答案 0 :(得分:0)

请从您的wsdl确认您是否在父级别有特殊的“标签”?

<xs:any namespace="##other" />

xmlAnyElement的存在可能是父<getNumberOfMatches>接受新元素的原因。

另一方面,当您将新<abc>标记放在<timing>标记中时,它不起作用。因为<timing>标记在定义的wsdl中没有xmlAnyElement

你可以在这里找到详细的工作:http://www.w3schools.com/schema/schema_complex_any.asp

如果这解决了您的问题,请告诉我。