少し複雑なオブジェクトを含む Web サービスで JAXB を使用しています。オブジェクトの 1 つである Sensor には、通信できる他のオブジェクトのリストがあり、必然的にそれ自体 (変更できない動作) を含めることができるため、XML へのマーシャリング中に循環参照が発生します。
@XmlAccessorType(XmlAccessType.FIELD)
public class Sensor extends BaseObject {
private ArrayList<SensorCommLink> sensorCommLinks;
}
@XmlAccessorType(XmlAccessType.FIELD)
public class SensorCommLink {
@XmlIDREF
private BaseObject receiver;
@XmlIDREF
private Sensor cueingSensor;
}
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class BaseObject {
@XmlElement
@XmlID
private String id;
}
上記のように、 @XmlIDREF と @XmlID を使用してこれを解決しましたが、非常にうまく機能します。
wsimport によって生成されたクライアント側コードは、オブジェクトを XML にマーシャリングし、サーバーはそれらを完全にアンマーシャリングできます。
私が経験している問題は、センサー オブジェクトをマーシャリングしようとすると、何らかの理由でサーバー側で循環参照例外が発生することです。腹立たしいのは、wsimport がクライアント側コードを作成するために使用する JAXB 注釈がサーバー側コードに含まれていることです。これはうまく機能しますが、サイクルのためにサーバー側センサーをマーシャリングできません。
JAXB がクライアント側のコードに追加するすべての余分な注釈をサーバー側のクラスにコピーしようとしましたが、おそらく JAXB に @XmlIDREF 注釈の適切な適用を妨げていたランタイム バグがあると考えました。そこには運がありません。
おそらく、ここで欠けている非常に基本的なものがありますが、この問題は私を少しバタバタさせており、それを理解しようとしている間、私は完全に停止しています.
調査中に気づいたことの 1 つは、コードは機能しますが、生成されたクライアント側オブジェクトの名前空間の一部が期待どおりではないということです。サーバー上の名前空間の問題が原因で IDREF マーシャリングが爆破されているかどうかを知りたいです。