使用@XmlIDREF避免JAXB循环引用

时间:2010-07-17 00:50:37

标签: reference jaxb cyclic

我在一个带有一些稍微复杂的对象的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;

}

如上所示,我使用@XmlIDREF和@XmlID解决了这个问题,它的效果非常好。

通过wsimport生成的客户端代码将对象编组为XML,服务器能够完美地解组它们。

我遇到的问题是,由于某种原因在服务器端,当我尝试编组Sensor对象时,我得到一个循环引用异常。令人抓狂的部分是服务器端代码包含wsimport用来创建客户端代码的JAXB注释,这很好用,但由于循环,我无法编组服务器端传感器。

我尝试将JAXB添加到客户端代码的所有额外注释复制到服务器端类中,以为JAXB中存在运行时错误,导致它无法正确应用@XmlIDREF注释。那里没有运气。

也许这里有一些我非常基本的东西,但是这个问题让我有些慌张,而且当我试图解决这个问题时我会陷入僵局。

有一件事我注意到我正在研究的是,生成的客户端对象上的某些命名空间并不是我所期望的,尽管代码可以工作。我很想知道服务器上的命名空间问题是否导致IDREF编组轰炸。

我们非常感谢任何有关修复或其他故障排除的建议!

干杯,

克里斯

1 个答案:

答案 0 :(得分:1)

服务器端的任何机会都是处理属性(get / set)而不是字段(实例变量)。您可以通过以下方式强制执行字段访问:

@XmlAccessorType(XmlAccessType.FIELD) 公共类SensorCommLink {

@XmlIDREF 
private BaseObject receiver; 
@XmlIDREF 
private Sensor cueingSensor; 

}

或者您可以注释get方法。

相关问题