2010-07-17 99 views
1

我在带有一些稍微复杂的对象的Web服务中使用JAXB。其中一个对象Sensor具有可与之通信的其他对象的列表,其中必须包含其自身(无法更改的行为),从而在编组为XML期间导致循环引用。使用@XmlIDREF避免JAXB循环引用

@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,服务器能够完美地解组它们。

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

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

也许有一些非常基本的东西我在这里想念但这个问题是驾驶我一个小屁股,我在一个死路,而我试图弄清楚。

我注意到我正在研究的一件事是,生成的客户端对象上的一些名称空间并不是我所期望的,尽管代码有效。我很好奇,看看服务器上的命名空间问题是否导致IDREF编组炸弹。

任何修复或其他故障排除的建议将非常感谢!

干杯,

克里斯

回答

1

在服务器端的任何机会,它正在处理属性(get /套),而不是字段(实例变量)。您可以执行下列方式字段访问:

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

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

}

或者你可以注释get方法。

+0

Blaise, 我不这么认为。 @XmlAccessorType(.. FIELD)位于SensorCommLink类上 - 我只是将这些额外的注释从原始帖子中删除。也许我会为了清晰起见而编辑它。谢谢,不过。 – 2010-07-20 20:44:26