21

「2 つのクラスが同じ XML タイプ名を持っています...」のような JAXB 例外を取得し、

例外の詳細は次のとおりです。

スレッド「メイン」での例外 com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 カウントの IllegalAnnotationExceptions 2 つのクラスが同じ XML タイプ名「city」を持っています。@XmlType.name および @XmlType.namespaceを使用して、それらに異なる名前を割り当てます。この問題は、次の場所に関連しています: public com.model.City の com.model.City com.model.Address の com.model.Address.getCurrentCity() この問題は、次の場所に関連しています: com.common .City at public com.common.City com.model.Address.getPreviousCity() at com.model.Address

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check (不明なソース) で com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet (不明なソース) で com.sun .xml.internal.bind.v2.runtime.JAXBContextImpl.(不明なソース) com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(不明なソース) com.sun.xml.internal. bind.v2.ContextFactory.createContext(未知のソース) com.sun.xml.internal.bind.v2.ContextFactory.createContext(未知のソース) at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) at sun.reflect.NativeMethodAccessorImpl. javax.xml.bind.ContextFinder の java.lang.reflect.Method.invoke(不明なソース) で、sun.reflect.DelegatingMethodAccessorImpl.invoke(不明なソース) での invoke(不明なソース)。javax.xml.bind.ContextFinder.find(不明なソース) の newInstance(不明なソース) javax.xml.bind.JAXBContext.newInstance(不明なソース) の javax.xml.bind.JAXBContext.newInstance(不明なソース) com. PojoToXSD.main(PojoToXSD.java:17)

私は次のような例を取りました:

package **com.model**; ---->this package contains 'Address' class and 'City' class

public class Address {

    private String areaName;
    private City currentCity;
    private com.common.City previousCity;
}

package com.model;

public class City {

    private String cityName;
}

「com.common」パッケージの別の都市クラス。

package **com.common**;

public class City {

    private String pinCode;
}

XSD を作成する必要があり、プロジェクト内の既存のコード (上記のコード例のように) を使用してマーシャリングとアンマーシャリングを行う必要があります。コードには「@XmlRootElement/@XmlType」などの注釈がなく、ソースコード。

上記の問題を修正する解決策や、XSD を作成してマーシャリング/アンマーシャリング (MOXy など) を行う他の方法はありますか?

誰からでも解決策を得ることができれば素晴らしいと思います....よろしくお願いします。

ありがとう、

サティア。

4

1 に答える 1

32

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

クラスに注釈を付けることができる場合

クラスを変更できる場合は、クラス@XmlTypeの 1 つに注釈を追加するだけでCity、対応する XML スキーマの型名を変更できます。

package **com.common**;

@XmlType(name="city2")
public class City {

    private String pinCode;
}

クラスにアノテーションを付けられない場合

MOXy は、変更できないクラスに JAXB メタデータを適用するために使用できる外部マッピング ドキュメント拡張機能を提供します。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="**com.common**">
    <java-types>
        <java-type name="City">
            <xml-type name="city2"/>
        </java-type>
    </java-types>
</xml-bindings>

詳細については


アップデート

1) 1 つの City クラスに対してのみバインド ファイルを作成する必要がありますか、それとも他の 2 つのクラス (Address と別の City を意味する) すべてを作成する必要がありますか?

MOXy の外部マッピング ドキュメントを使用し て、クラスのメタデータを拡張または完全に置き換えることができます ( http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml-schemas.htmlを参照)。必要な変更がクラスの 1 つだけである場合Cityは、他のクラスを含める必要はありません。

2)バインディングファイルでは、クラス名のみを考慮していましたが、Cityで定義されたプロパティを取得する必要はありません(つまり、pinCode)?

MOXy は、他の JAXB 実装と同様に、すべてのクラスにデフォルトのマッピングを適用します。マッピングの動作をデフォルトとは異なるものにするメタデータのみを提供する必要があります。

3)これにはMOXyを選択する必要がありますか?

JAXB には、標準の外部マッピング ドキュメントがありません。私が説明したのは MOXy 拡張です。JAXB RI を使用している場合は、Annox との統合を確認できます。

于 2013-10-02T09:54:54.630 に答える