3

次のクラスのJARxxx-core.jarがあるとします。

@XmlRootElement
@XmlSeeAlso({Imp1.class, Imp2.class})
public abstract class Abst {...}

@XmlRootElement
public class Imp1 extends Abst {...}

@XmlRootElement
public class Imp2 extends Abst {...}

public class Main {
  @XmlElement
  private Abst abst;

  public static void load(File file) {
    // unmarshal this
  }
  public void save(File file) {
    // marshal this
  }
}

ここまでは順調ですね。Mainはマーシャリングおよび非マーシャリングが可能であり、Abstの正しい実装が使用されます。

ここで、他の誰かがやって来て、xxx​​-core.jarを使用する別のプロジェクトxxx-extension.jarを作成するとどうなりますが、次のクラスが含まれています。

@XmlRootElement
public class ExtensionImp extends Abst {...}

そして、この新しい実装のインスタンスをMainのメンバー変数に割り当てますか?XmlSeeAlsoアノテーションで明示的に指定されていないため、ExtensionImpが正しくマーシャリング/アンマーシャリングされることを確認するにはどうすればよいですか?(JAXBContext.newInstance()でクラスリストを試してみましたが、それでは問題が解決しないようです。)

4

2 に答える 2

1

アノテーションは、@XmlSeeAlsoJAXB(JSR-222)implに他のクラスを参照するように通知するメカニズムにすぎません。または、をブートストラップするために使用されるクラスにそれを含めることもできますJAXBContext。あなたがあなたを作成するとき、あなたJAXBContextはただする必要があります:

JAXBContext jc = JAXBContext.newInstance(Abst.class, ExtensionImp.class);

更新1

JAXBContext.newInstance()でクラスリストを試してみましたが、それでは問題が解決しないようです。

これは間違いなく問題を解決するはずです、これを行うとどうなりますか。


更新2

あなたの問題は、あなたがどのようにブートストラップしているのかではなく、あなたがマーシャリングしていないドキュメントに起因しているのではないかと思います。以下が役立つはずです。

継承-xsi:type

現在マッピングを行っている方法では、インスタンス化されたインスタンスがクラスのフィールドにImp2入力されるように、XMLが次のようになっていることを確認する必要があります。abstMain

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
    <abst xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="imp2"/>
</main>

詳細については、以下を参照してください。

継承置換グループ

次のようなXMLドキュメントのマーシャリングを解除したい場合:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<main>
    <imp2/>
</main>

@XmlElementRef次に、アノテーションを活用する必要があります。

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Main {
    @XmlElementRef
    Abst abst;
}

詳細については、以下を参照してください。

于 2012-10-03T13:33:25.727 に答える
0

を使用して同様の問題を解決し@XmlAnyElement(lax=true)ました。@XmlElementメインクラスではなく、このアノテーションを配置してみてください。

于 2012-10-03T12:50:05.373 に答える