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つのスキーマ間の違いを理解していませんが、これは機能していません...