JAXB名称空间仅限于某些标记

时间:2017-04-18 11:13:05

标签: java xml soap jaxb

我有一个需要使用的SOAP端点。 java代码生成是使用maven插件 - wsimport完成的。问题是端点返回带有其他有效请求的错误数据。以下是传递请求的示例:

<soapenv:Envelope     
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:upd="http://www.vivacom.bg/UpdateBAInvoiceInfo/">
   <soapenv:Header/>
   <soapenv:Body>
      <upd:UpdBAInvoiceInfoRequest>
         <BillingAccountCode>10122190001</BillingAccountCode>
         <SSOGUID>1234567</SSOGUID>
         <RequestedInvoiceType>E</RequestedInvoiceType>
         <eMail1>govcharov@abv.bg</eMail1>
         <InputRequestID>SSS0123456789</InputRequestID>
         <InputTimeStamp>20170202131615154</InputTimeStamp>
      </upd:UpdBAInvoiceInfoRequest>
   </soapenv:Body>
</soapenv:Envelope>

这里&#34; upd&#34;前缀在顶层定义。但是,JAXB会生成此请求:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <S:Body>
        <UpdBAInvoiceInfoRequest 
 xmlns="http://www.vivacom.bg/UpdateBAInvoiceInfo/">
            <BillingAccountCode>10122190001</BillingAccountCode>
            <SSOGUID>1234567</SSOGUID>
            <RequestedInvoiceType>E</RequestedInvoiceType>
            <eMail1>govcharov@abv.bg</eMail1>
            <InputRequestID>NMS2081417920</InputRequestID>
            <InputTimeStamp>20170202131615154</InputTimeStamp>
        </UpdBAInvoiceInfoRequest>
    </S:Body>
</S:Envelope>

&#34; upd&#34;缺少限定符,并且xmlns嵌入在标记中。手动修改package-info.java并添加Xmlns前缀

之后
@javax.xml.bind.annotation.XmlSchema(namespace = 
"http://www.vivacom.bg/UpdateBAInvoiceInfo/",
        elementFormDefault = XmlNsForm.QUALIFIED,
        attributeFormDefault = XmlNsForm.UNSET,
        xmlns = {
                @XmlNs(prefix="upd", 
namespaceURI="http://www.vivacom.bg/UpdateBAInvoiceInfo/")
        })

生成的请求会添加&#34; upd&#34;所有元素的前缀和结果&#34; BadData&#34;再次,因为元素没有在命名空间中定义,而是为类型嵌入。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <S:Body>
        <upd:UpdBAInvoiceInfoRequest 
xmlns:as="http://www.vivacom.bg/UpdateBAInvoiceInfo/">

<upd:BillingAccountCode>10122190001</upd:BillingAccountCode>
            <upd:SSOGUID>1234567</upd:SSOGUID>
            <upd:RequestedInvoiceType>E</upd:RequestedInvoiceType>
            <upd:eMail1>govcharov@abv.bg</upd:eMail1>
            <upd:InputRequestID>NMS2513334601</upd:InputRequestID>
<upd:InputTimeStamp>20170202131615154</upd:InputTimeStamp>
        </upd:UpdBAInvoiceInfoRequest>
    </S:Body>
 </S:Envelope>

我需要添加&#34; upd&#34;在BillingAccountCode之前,但不在其属性之前。

1 个答案:

答案 0 :(得分:0)

经过几个小时尝试不同的解决方案后,我在发布问题后几分钟找到答案...... 我将elementFormDefault从XmlNsForm.QUALIFIED更改为XmlNsForm.UNSET,它正是我所需要的。现在我需要以这种方式使wsimport maven插件生成package-info.java文件。

@javax.xml.bind.annotation.XmlSchema(
        namespace = "http://www.vivacom.bg/UpdateBAInvoiceInfo/",
        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNSET)