4

jaxb.in​​dex ファイル内でネストされたクラスを参照しようとすると、シリアル化中に例外がスローされます。どうすればこれを回避できますか?

これは Eclipse RCP アプリケーションにあります。例外の原因となっているクラスは、JAXB コンテキストを作成してシリアライゼーションを開始するプラグインとは異なるプラグインにあります。クラスは、プラグインのエクスポートされたパッケージの 1 つにあります。

クラス構造は次のようになります (名前は変更されています)。

@XmlRootElement(name="foo")
@XmlAccessorType (XmlAccessType.FIELD)
public class Foo extends AbstractFoo {
   ...
    @XmlRootElement(name="fooMetric")
    @XmlAccessorType (XmlAccessType.FIELD)
    public static class FooMetric implements IFooMetric {
        ...
    }
}

jaxb.in​​dex ファイルには以下が含まれます。

Foo
Foo.FooMetric

シリアル化中に、例外は「OuterClass.InnerClass」を使用するように指示します-これは私が行っています。

javax.xml.bind.JAXBException: com/mypackage/jaxb.in​​dex にリストされているクラス "Foo.FooMetric" のロード中にエラーが発生しました。エントリが CLASSPATH でアクセス可能であり、" ClassName" または "OuterClass.InnerClass" の形式ではないことを確認してください。 ClassName.class" または "fully.qualified.ClassName" - リンクされた例外: [java.lang.ClassNotFoundException: com.mypackage.Foo.FooMetric]

また、javadoc ( 「jaxb.in​​dex のフォーマット」 ) は、jaxb.in​​dex に OuterClass.InnerClass の形式のエントリを含めることができることを示唆しています。

jaxb.in​​dex ファイルで発生するクラス名の制約は次のとおりです。

  • 「.class」で終わってはいけません。
  • クラス名は、jaxb.in​​dex ファイルを含むパッケージに対して相対的に解決されます。jaxb.in​​dex ファイルを含むパッケージに直接出現するクラスのみが許可されます。
  • 完全修飾クラス名は使用できません。現在のパッケージに関連する修飾クラス名は、ネストされたクラスまたは内部クラスのみを指定できます。

ただし、これは機能していないようです。それを機能させるものは何ですか?

4

1 に答える 1

5

私が(試行錯誤によって)見つけた解決策はOuterClass$InnerClass、 の代わりに jaxb.in​​dexを使用することでしOuterClass.InnerClassた。これにより、シリアル化が正常に完了します。

ただし、これを推奨する信頼できる情報源は見つかりませんでした。

[スタックオーバーフローのガイドラインに従ってこのソリューションを投稿していますが、より良い回答を見て受け入れたいと思っています。]

于 2013-06-10T13:33:28.847 に答える