Reference 使用@XmlIDREF避免JAXB循环引用

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

我在web服务中使用JAXB处理一些稍微复杂的对象。其中一个对象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;

}
@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类上——我刚从我的原始帖子中删除了这些额外的注释。为了清晰起见,也许我会编辑它。不过谢谢你。