Reference 使用@XmlIDREF避免JAXB循环引用
我在web服务中使用JAXB处理一些稍微复杂的对象。其中一个对象Sensor有一个它可以与之通信的其他对象的列表,其中必然包括它本身(无法更改的行为),从而在编组为XML时产生循环引用Reference 使用@XmlIDREF避免JAXB循环引用,reference,jaxb,cyclic,Reference,Jaxb,Cyclic,我在web服务中使用JAXB处理一些稍微复杂的对象。其中一个对象Sensor有一个它可以与之通信的其他对象的列表,其中必然包括它本身(无法更改的行为),从而在编组为XML时产生循环引用 @XmlAccessorType(XmlAccessType.FIELD) public class Sensor extends BaseObject { private ArrayList<SensorCommLink> sensorCommLinks; } @XmlAccessor
@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;
}
@xmlacessortype(xmlacesstype.FIELD)
公共类传感器扩展BaseObject{
专用ArrayList sensorCommLinks;
}
@XmlAccessorType(XmlAccessType.FIELD)
公共类传感器通信链路{
@XmlIDREF
专用基本对象接收器;
@XmlIDREF
专用传感器;
}
@XmlAccessorType(XmlAccessType.FIELD)
公共抽象类BaseObject{
@XmlElement
@XmlID
私有字符串id;
}
如上所示,我使用@XmlIDREF和@XmlID解决了这个问题,效果非常好
通过wsimport生成的客户端代码将对象封送到XML,服务器能够完美地解组它们
我遇到的问题是,由于某种原因,在服务器端,当我尝试封送传感器对象时,我会遇到循环引用异常。令人恼火的是,服务器端代码包含了wsimport用来创建客户端代码的JAXB注释,这非常有效,但由于这个循环,我无法封送服务器端传感器
我尝试将JAXB添加到客户端代码中的所有额外注释复制到服务器端类中,认为JAXB中可能存在运行时缺陷,阻止它正确应用@XmlIDREF注释。那里运气不好
也许我在这里遗漏了一些非常基本的东西,但这个问题让我有点紧张,在我试图弄清楚它的时候,我已经停了下来
我注意到我正在调查的一件事是,生成的客户端对象上的一些名称空间不是我所期望的,尽管代码可以工作。我很好奇服务器上的名称空间问题是否会导致IDREF编组爆炸
如果您对修复或其他故障排除有任何建议,我们将不胜感激
干杯
Chris服务器端是否有可能处理属性(get/set)而不是字段(实例变量)。您可以通过以下方式强制执行字段访问: @XmlAccessorType(XmlAccessType.FIELD) 公共类SensorCommLink{
@XmlIDREF
private BaseObject receiver;
@XmlIDREF
private Sensor cueingSensor;
}
或者您可以对get方法进行注释。服务器端处理属性(get/set)而不是字段(实例变量)。您可以通过以下方式强制执行字段访问: @XmlAccessorType(XmlAccessType.FIELD) 公共类SensorCommLink{
@XmlIDREF
private BaseObject receiver;
@XmlIDREF
private Sensor cueingSensor;
}
或者您可以对get方法进行注释。Blaise,我不这么认为。@XmlAccessorType(..字段)位于SensorCommLink类上——我刚从我的原始帖子中删除了这些额外的注释。为了清晰起见,也许我会编辑它。不过谢谢。布莱斯,我不这么认为。@XmlAccessorType(..字段)位于SensorCommLink类上——我刚从我的原始帖子中删除了这些额外的注释。为了清晰起见,也许我会编辑它。不过谢谢你。