java - 编码时如何将命名空间属性添加到 JAXB 中的元素?

标签 java xml jaxb xml-namespaces

我正在使用 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 对象(使用传递给 MarshallerDOMResult),然后查看是否可以对 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/

相关文章:

java - 在准备好的语句中将负 java long 转换为 clickhouse Uint64

xml - 如何停止 Eclipse XML 格式化程序将文本放在新行上?

python - URL 以/开头时 XML2PDF 抛出异常

java - 通过 org.w3c.dom API 公开 JAXB 注解的对象

java - JAXBgenerateElementProperty代码位置

java - Java有指针吗?

Java - 获取一周中的星期一日期并给出该周的日期

java - 不同的端点看似随机地获得授权

java - 单击按钮后搜索索引值

java - 具有不同 namespace 的 JAXB 片段