まず第一に、小さな例です。クラスReferencingEntityは、抽象クラスAbstractEntityへの参照を保持します。このクラスには2つの実装があります。
@XmlRootElement
public abstract class AbstractEntity {
@XmlID
private String id;
}
@XmlRootElement
public class EntityImpl1 extends AbstractEntity {
}
@XmlRootElement
public class EntityImpl2 extends AbstractEntity {
}
@XmlRootElement
public class ReferencingEntity {
@XmlIDREF
private AbstractEntity entity;
}
ReferencingEntityのインスタンスをマーシャリングすることに問題はありません(具体的なタイプがxmlに存在しないことを除いて)が、xml表現を非マーシャリングしようとすると、具体的な実装を決定するための記述子がありません。
現在、XmlAdapterを使用してすべての非IDフィールドをnullに設定していますが、可能であれば@XmlIDを使用することをお勧めします。何か案は?
更新:JBoss 6.1.0.FinalでRESTEasyを使用しており、プロバイダーは次のようにコンテキストを作成します。
ContextResolver<JAXBContextFinder> resolver = providers.getContextResolver(JAXBContextFinder.class, mediaType);
JAXBContextFinder finder = resolver.getContext(type);
if (finder == null)
{
if (reader) throw new JAXBUnmarshalException("Could not find JAXBContextFinder for media type: " + mediaType);
else throw new JAXBMarshalException("Could not find JAXBContextFinder for media type: " + mediaType);
}
JAXBContext context = finder.findCachedContext(type, mediaType, annotations);