Java 在编组时,如何向JAXB中的元素添加名称空间属性?

Java 在编组时,如何向JAXB中的元素添加名称空间属性?,java,xml,jaxb,xml-namespaces,Java,Xml,Jaxb,Xml Namespaces,我正在使用易趣的LMS(大型商户服务),并不断遇到以下错误: org.xml.sax.SAXException: SimpleDeserializer遇到子级 元素,该元素在 它试图做的事情 反序列化 经过反复试验,我找出了问题所在。事实证明,这是可行的: <?xml version="1.0" encoding="UTF-8"?> <BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents"> &

我正在使用易趣的LMS(大型商户服务),并不断遇到以下错误:

org.xml.sax.SAXException:
SimpleDeserializer遇到子级
元素,该元素在
它试图做的事情
反序列化

经过反复试验,我找出了问题所在。事实证明,这是可行的:

<?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">
通过请求添加了类定义

这样编辑了上述类,但没有任何效果:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "urn:ebay:apis:eBLBaseComponents",
name = "AddFixedPriceItemRequestType", propOrder = {
    "item"
})
public class AddFixedPriceItemRequestType
下面是
BulkDataExchangeRequestsType
类的一个片段。我尝试在
AddFixedPriceItemRequest
@XmlElement
中加入
namespace=“urn:ebay:api:eBLBaseComponents”
,但它没有做任何事情

@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;
@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=“BulkDataExchangeRequestsType”,比例器={
“标题”,
“addFixedPriceItemRequest”
})
公共类BulkDataExchangeRequestsType{
@xmlement(name=“Header”)
受保护的MerchantDataRequestHeaderType标头;
@xmlement(name=“AddFixedPriceItemRequest”)
受保护列表addFixedPriceItemRequest;

尝试使用类注释

@XmlType(namespace="urn:ebay:apis:eBLBaseComponents")


属性注释如果您只想在某些情况下指定名称空间

据我所知,您的XML片段在语义上是相同的。
AddFixedPriceItemRequest
元素上的
xmlns
属性是多余的,因为它隐式继承其父元素的名称空间。JAXB知道这一点,并且因此,不必麻烦将名称空间添加到
AddFixedPriceItemRequest
——这只是不必要的

如果ebay服务器仅在存在
AddFixedPriceItemRequest
xmlns
时才工作,那么它就坏了,对输入的要求超过了XML和模式所要求的要求。如果确实如此(这很难相信,但有可能),然后使用像JAXB这样的Java XML文档模型将是一场斗争,因为这将假定XML就是XML就是XML。低级的关于哪些元素获得
xmlns
声明的吹毛求疵不会暴露在API中,因为它不应该被需要

我的方法是将JAXB模型封送到DOM对象(使用传递给
封送器的
DOMResult
),然后查看是否可以手动调整DOM,以将
xmlns
强制放入文档中的适当位置。然后可以将该DOM序列化为XML并发送

你不应该这样做,我怀疑你可能在其他地方做错了什么;这比ebay web服务像这样被破坏的可能性更大



编辑:这里有另一个建议,比JAXB到DOM到XML的解决方案稍微好一点。如果您的请求XML在结构上是合理的静态,只有数值/字符串值发生变化,那么将其定义为字符串模板,然后在运行时替换这些值并发送。然后您可以使用JAXB解释结果。我在带有web服务的oast需要非常精确的名称空间前缀,而说服java XML库遵守这一点是非常困难的。

检查生成的类中的字段是否缺少
@xmlement
注释,如果存在,它们是否缺少名称空间属性。这两个字段必须存在才能获得封送xml中每个元素的名称空间前缀。

您所说的“通过JAXB生成”到底是什么意思?您可以添加AddFixedPriceItemRequest类的定义吗?我正在通过JAXB使用编组来生成XML。我看不到任何将xmlns属性添加到BulkDataExchangeRequestsType类的特定标记。我在问题中添加了AddFixedPriceItemRequestType类定义。为什么不针对WSDL?您是否曾尝试在@XmlType中指定名称空间作为属性值,如我的回答中所述?@Martin OConnor您指的是BulkDataExchange服务,但所讨论的文件指向FileTransfer服务。我使用的类都是从Merchant API生成的,因为eBay表示它们没有用于e FileTransfer服务。我修改了MerchantData.xsd以生成我目前所拥有的。你是对的,这毫无意义,但是,我已经对它进行了测试-发送完全相同的文件(他们的LMS服务要求你上传一个文件,然后在他们着手处理时进行处理)除了对一个额外的xmlns进行一次更改外,如果没有它,服务将返回“失败”每一次。当它存在的时候,它没有那个问题。我想我希望有一个更简单的方法-通过DOM拖动它看起来真的很麻烦,但我感觉任何解决方案在这一点上都是一个野兽。不幸的是,这可能不起作用,因为它在创建内容的方式上是相当动态的。好的想法是w事实并非如此。这不起作用,我遇到了与海报相同的问题
@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;
@XmlType(namespace="urn:ebay:apis:eBLBaseComponents")
@XmlElement(namespace="urn:ebay:apis:eBLBaseComponents")