我正在使用 eBay 的 LMS(大型商户服务)并不断遇到错误:
org.xml.sax.SAXException:
SimpleDeserializer encountered a child
element, which is NOT expected, in
something it was trying to
deserialize.
经过大量 的反复试验,我找到了问题所在。事实证明这是可行的:
<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<Version>583</Version>
<SiteID>0</SiteID>
</Header>
<AddFixedPriceItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
虽然这(我一直在发送的)没有:
<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
<Header>
<Version>583</Version>
<SiteID>0</SiteID>
</Header>
<AddFixedPriceItemRequest>
不同之处在于 AddFixedPriceItemRequest
上的 XML 命名空间属性。我的所有 XML 目前都通过 JAXB 进行编码,我不确定将第二个 xmlns 属性添加到文件中不同元素的最佳方法是什么。
这就是问题所在。如何将 xmlns 属性添加到 JAXB 中的另一个元素?
package ebay.apis.eblbasecomponents;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AddFixedPriceItemRequestType", propOrder = {
"item"
})
public class AddFixedPriceItemRequestType
extends AbstractRequestType
{
@XmlElement(name = "Item")
protected ItemType item;
public ItemType getItem() {
return item;
}
public void setItem(ItemType value) {
this.item = value;
}
}
根据要求添加了类定义。
像这样编辑上面的类没有效果:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "urn:ebay:apis:eBLBaseComponents",
name = "AddFixedPriceItemRequestType", propOrder = {
"item"
})
public class AddFixedPriceItemRequestType
这是 BulkDataExchangeRequestsType
类的片段。我尝试将 namespace="urn:ebay:apis:eBLBaseComponents"
放入 @XmlElement
以获取 AddFixedPriceItemRequest
但它没有执行任何操作。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BulkDataExchangeRequestsType", propOrder = {
"header",
"addFixedPriceItemRequest"
})
public class BulkDataExchangeRequestsType {
@XmlElement(name = "Header")
protected MerchantDataRequestHeaderType header;
@XmlElement(name = "AddFixedPriceItemRequest")
protected List<AddFixedPriceItemRequestType> addFixedPriceItemRequest;
最佳答案
据我所知,您的 XML 片段在语义上是相同的。 AddFixedPriceItemRequest
元素上的 xmlns
属性是多余的,因为它隐式继承了其父元素的 namespace 。 JAXB 知道这一点,因此不会费心将命名空间添加到 AddFixedPriceItemRequest
- 只是没有必要。
如果 ebay 服务器仅在 AddFixedPriceItemRequest
xmlns
出现时才工作,那么它就坏了,并且对输入的要求超出了 XML 和由架构。如果情况确实如此(这很难相信,但有可能),那么使用像 JAXB 这样的 Java XML 文档模型将是一场斗争,因为这将假定 XML 就是 XML 就是 XML。关于哪些元素获得 xmlns
声明的低级放屁不会暴露给 API,因为它不需要。
这些都对您没有帮助。我的方法是将 JAXB 模型编码为 DOM 对象(使用传递给 Marshaller
的 DOMResult
),然后查看是否可以对 DOM 进行一些手动调整强制将 xmlns
放入文档中的适当位置。然后,您可以将该 DOM 序列化为 XML 并发送。
你不应该这样做,我怀疑你可能在某处做错了什么;这比像这样破坏 ebay 网络服务的可能性更大。
编辑:这是另一个建议,比 JAXB 到 DOM 到 XML 的解决方案要好一些。如果您的请求 XML 在结构上是合理的静态,只有数字/字符串值发生变化,则将其定义为字符串模板,然后在运行时替换值,然后发送。然后您可以使用 JAXB 解释结果。当说服 Java XML 库符合这一点时,我已经在 oast 中使用 web 服务 thyat 需要非常精确的 namespace 前缀,这是非常困难的。
关于java - 编码时如何将命名空间属性添加到 JAXB 中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1751048/