我在一个带有一些稍微复杂的对象的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编组轰炸。
我们非常感谢任何有关修复或其他故障排除的建议!
干杯,
克里斯
答案 0 :(得分:1)
服务器端的任何机会都是处理属性(get / set)而不是字段(实例变量)。您可以通过以下方式强制执行字段访问:
@XmlAccessorType(XmlAccessType.FIELD) 公共类SensorCommLink {
@XmlIDREF
private BaseObject receiver;
@XmlIDREF
private Sensor cueingSensor;
}
或者您可以注释get方法。