6

eBay の LMS (Large Merchant Services) を使用していますが、エラーが発生し続けています。

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">

これ(私が送信したもの)はそうではありませんが:

<?xml version="1.0" encoding="UTF-8"?>
<BulkDataExchangeRequests xmlns="urn:ebay:apis:eBLBaseComponents">
  <Header>
    <Version>583</Version>
    <SiteID>0</SiteID>
  </Header>
  <AddFixedPriceItemRequest>

違いは、 の XML 名前空間属性ですAddFixedPriceItemRequest。現在、私の XML はすべて JAXB を介してマーシャリングされていますが、ファイル内の別の要素に 2 番目の xmlns 属性を追加する最善の方法がわかりません。

それが質問です。JAXB の別の要素に xmlns 属性を追加するにはどうすればよいですか?

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これがクラスのスニペットです。for にanamespace="urn:ebay:apis:eBLBaseComponents"を投げてみましたが、何もしませんでした。@XmlElementAddFixedPriceItemRequest

@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;
4

3 に答える 3

6

私の知る限り、XMLフラグメントは意味的に同一です。要素のxmlns属性はAddFixedPriceItemRequest、親要素の名前空間を暗黙的に継承するため、冗長です。JAXBはこれを知っているので、名前空間をわざわざ追加するAddFixedPriceItemRequest必要はありません。必要はありません。

eBayサーバーが存在する場合にのみ機能している場合、AddFixedPriceItemRequest xmlnsそれは壊れており、XMLおよびスキーマで必要とされる入力に加えて入力を要求しています。これが実際に当てはまる場合(信じがたいですが、可能です)、JAXBのようなJava XMLドキュメントモデルを使用するのは困難です。これは、XMLがXMLであると想定するためです。どの要素が宣言を取得するかについての低レベルのおならはxmlns、必要ではないため、APIには公開されません。

どれもあなたを助けていません。私のアプローチは、JAXBモデルをDOMオブジェクトにマーシャリングし(にDOMResult渡されたものを使用して)、DOMを手動で微調整して、ドキュメントの適切な場所Marshallerに強制的に挿入できるかどうかを確認することです。xmlns次に、そのDOMをXMLにシリアル化して送信できます。

あなたはこれをする必要はないはずです、そして私はあなたがどこかで何か他の間違ったことをしているのではないかと思います。これは、ebayWebサービスがこのように壊れているよりも可能性が高いです。


編集:ここに別の提案があります。これは、JAXBからDOM、XMLへのソリューションよりも少しひどいものではありません。リクエストXMLの構造が合理的で静的であり、数値/文字列値のみが変更されている場合は、それを文字列テンプレートとして定義し、実行時に値を置き換えて送信します。その後、JAXBを使用して結果を解釈できます。私はこれをWebサービスでオーストで行いましたが、Java XMLライブラリに準拠するように説得するのは非常に困難でしたが、非常に正確な名前空間プレフィックスが必要でした。

于 2009-11-17T21:47:12.837 に答える
4

クラス アノテーションを使用してみる

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

また

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

特定の場合にのみ名前空間を指定したい場合のプロパティ注釈

于 2009-11-17T19:12:09.773 に答える
4

生成されたクラス内のフィールドに@XmlElement注釈がないかどうか、存在する場合は名前空間属性がないかどうかを確認してください。マーシャリングされた xml 内のすべての要素に対して名前空間プレフィックスを取得するには、これら 2 つが存在する必要があります。

于 2011-02-16T00:22:32.190 に答える