Glassfish 3.1.1 で実行される Web サービスに問題がありますが、glassfish 3.1.2.2 では失敗します。
@XmlSeeAlso({
B.class,
BId.class,
C.class,
CId.class
})
public abstract class A {
private Id id;
}
public abstract class Id {
}
public class B extends A {}
public class C extends A {}
public class BId extends Id {}
public class CId extends Id {}
クラス B は実行時に BId を取得し、C は CId を取得します。
他にもいくつかの場所があり、抽象クラスがあり、Web サービスのシリアル化が正常に機能し、生成された xml に xsi:type 修飾子が表示されます。ただし、この場合、xsi:type 修飾子は追加されず、次のような結果が得られます。
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="B">
<id>
...
</id>
...
</a>
そのため、アンマーシャリングは ID のタイプを識別できず、サブクラスではなく抽象 Id をインスタンス化しようとします。
私の推測では、これはグラスフィッシュ 3.1.2 に追加された eclipselink moxy のバグであるということです (しかし、それについては間違っている可能性があります)。
私はすでに @XmlSeeAlso タグを追加しようとしましたが、それは役に立ちませんでした。@XmlRootElement と @XmlElementRef も使用してみましたが、生成された A のスタブで getId() メソッドを生成することはできませんでした。基本型を返す getId 。