0

Java 1.6_u33 での JAXB マーシャリングに問題があります。

Java クラスを生成し、XML ファイルをマーシャリングするために使用される 5 つのスキーマ .xsd があります。

問題は 1 つのケースのみです。このファイルでは、JAXB は追加の名前空間プレフィックス ns2 を生成します。すべてのスキーマが同一であり、マーシャリング メカニズムがすべてのスキーマに共通であるため、これは非常に奇妙です。

生成メカニズム:

    JAXBContext context = JAXBContext.newInstance(type);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
            Boolean.TRUE);
    marshaller.marshal(file, doc);

そして、悪い xml の最初の行:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ns2:Document xmlns:ns2="urn:iso:std:iso:20022:tech:xsd:camt.056.001.01">
  <ns2:camt.056.001.01>
    <ns2:Assgnmt>
      <ns2:Id>NOTPROVIDED</ns2:Id>
      <ns2:CreDtTm>2008-06-24T00:00:00</ns2:CreDtTm>
    </ns2:Assgnmt>

同じ設定で、別の xsd から生成された xml は次のとおりです。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.029.001.03">
  <camt.029.001.03>
    <Assgnmt>
      <Id>NOTPROVIDED</Id>
      <CreDtTm>2008-03-26T00:00:00</CreDtTm>
    </Assgnmt>

どんな助けにもとても感謝しています...ありがとう。


質問への回答を追加できなかったので、ここに説明を追加します。

正しく動作しないパッケージの場合:

パッケージ情報:

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:iso:std:iso:20022:tech:xsd:camt.056.001.01", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package eu.axabank.axaconverter.datamodel.camt056;

オブジェクトファクトリー

package eu.axabank.axaconverter.datamodel.camt056;

import javax.xml.bind.annotation.XmlRegistry;


/**
 * This object contains factory methods for each 
 * Java content interface and Java element interface 
 * generated in the eu.axabank.axaconverter.datamodel.camt056 package. 
 * <p>An ObjectFactory allows you to programatically 
 * construct new instances of the Java representation 
 * for XML content. The Java representation of XML 
 * content can consist of schema derived interfaces 
 * and classes representing the binding of schema 
 * type definitions, element declarations and model 
 * groups.  Factory methods for each of these are 
 * provided in this class.
 * 
 */
@XmlRegistry
public class ObjectFactory {


    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: eu.axabank.axaconverter.datamodel.camt056
     * 
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link CaseAssignmentBIC }
     * 
     */
    public CaseAssignmentBIC createCaseAssignmentBIC() {
        return new CaseAssignmentBIC();
    }

    /**
     * Create an instance of {@link UnderlyingTransaction }
     * 
     */
    public UnderlyingTransaction createUnderlyingTransaction() {
        return new UnderlyingTransaction();
    }

    /**
     * Create an instance of {@link PaymentTransactionInformation }
     * 
     */
    public PaymentTransactionInformation createPaymentTransactionInformation() {
        return new PaymentTransactionInformation();
    }

    /**
     * Create an instance of {@link RemittanceInformation }
     * 
     */
    public RemittanceInformation createRemittanceInformation() {
        return new RemittanceInformation();
    }

    /**
     * Create an instance of {@link OriginalTransactionReference }
     * 
     */
    public OriginalTransactionReference createOriginalTransactionReference() {
        return new OriginalTransactionReference();
    }

    /**
     * Create an instance of {@link ControlData }
     * 
     */
    public ControlData createControlData() {
        return new ControlData();
    }

    /**
     * Create an instance of {@link Document }
     * 
     */
    public Document createDocument() {
        return new Document();
    }

    /**
     * Create an instance of {@link CancellationReasonInformationBICorName }
     * 
     */
    public CancellationReasonInformationBICorName createCancellationReasonInformationBICorName() {
        return new CancellationReasonInformationBICorName();
    }

    /**
     * Create an instance of {@link ActiveOrHistoricCurrencyAndAmountEUR }
     * 
     */
    public ActiveOrHistoricCurrencyAndAmountEUR createActiveOrHistoricCurrencyAndAmountEUR() {
        return new ActiveOrHistoricCurrencyAndAmountEUR();
    }

    /**
     * Create an instance of {@link Camt056 }
     * 
     */
    public Camt056 createCamt056() {
        return new Camt056();
    }

}

適切に機能するパッケージの場合:

パッケージ情報:

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:iso:std:iso:20022:tech:xsd:camt.029.001.03", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package eu.axabank.axaconverter.datamodel.camt029;

そして、オブジェクト ファクトリはまったく同じように見えます (もちろんネーミングを除いて)。

私は QName 要素を試しました - それはメカニズムの一般的な性質のために不便です - しかし良い結果はありません.

NamespacePrefixMapper を使用していました:

        NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
            public String getPreferredPrefix(String namespaceUri,
                    String suggestion, boolean requirePrefix) {
                return "";
            }
        };
        marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
                mapper);

しかし、このマッパーは機能しませんでした! 彼は設定していましたが、マーシャリング中にメソッド getPreferredPrefix が呼び出されることはありませんでした。

私は4つのスキーマ間の違いを理解していませんが、これは機能していません...

4

1 に答える 1

0

問題が検出されました!

私は混乱していますが、それは私の間違いでした。

真鍮の鋲に取り掛かるには:

5 つの異なるスキーマから Java クラスの 5 つのパッケージを生成しました。ただし、単純なタイプ (スキーマの共通オブジェクト) を持つ 1 つのスキーマをインポートしていました。私はこの一般的な XSD を主にオブジェクトに配置しました....ええ、主に。2つの要素がありました...残念ながら。この complexTypes は、このケースで生成されたオブジェクトによってのみ使用されました - 動作していません - ケース。

ポイントは、2 つのオブジェクトが別の Objectfactory から生成されていたことです。別のパッケージに配置されています。

複数のオブジェクト ファクトリからのオブジェクトを 1 つのマーシャリング オブジェクトに混在させると、最初の投稿で説明した問題が発生すると推測します。

手がかりは次のとおりです。XML に多くの名前空間を持たせたくない場合は、2 つのオブジェクト ファクトリを使用したり、複雑な型のスキーマをインポートしたりしないでください。

于 2012-08-02T09:03:02.807 に答える