1

我在带有一些稍微复杂的对象的 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 编组爆炸。

4

1 回答 1

1

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

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

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

}

或者您可以注释 get 方法。

于 2010-07-20T14:31:54.597 回答