java@XmlIDREF在编组为XML时看不到层次结构
我对XML非常陌生,我遇到了一个无法解决的问题,在四处寻找了几个小时后,我决定发布我的问题
我使用@XmlIDREF在XML文档中只包含一些java类的XmlID。 所有这些都可以正常工作,但是当JAXB根据树层次结构查找ID时,它似乎找不到ID,并再次调用整个对象
我将向您展示(简化)模型,它是关于光路由器的,java类代表路由器和一些组件:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class OpticalRouter {
// @XmlID inherited from upper class
private List<FiberConnection> fiberConnections = new ArrayList<FiberConnection>();
}
这是光纤连接:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class FiberConnection {
@XmlID
private String instanceID;
@XmlIDREF
Card card;
@XmlIDREF
Port port;
@XmlIDREF
Channel channel;
}
最后:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({
DropCard.class,
AddCard.class
})
public class Card{
// @XmlID inherited from supper class
}
当我管理端口和通道时,所有这些都可以正常工作,因为它们没有子类。。。。但是当需要整理卡时如果是AddCard或DropCard,它会另一次整理,而不是使用IDREF。 JAXB似乎没有在层次结构中找到它们
如果我改变了原来的“卡”例如,“AddCard”的FiberConnection也可以使用(JAXB找到IdREF,不再马歇尔它)
希望我已经解释清楚了。 如果不是,我很乐意回答:)
提前谢谢
已编辑
好的,我带着新的信息和结果回来了,以便更好地解释我自己
由于它是一个巨大的类模型,我不想让文章变得很难阅读,我创建了一种UML类图,通过一些重要的信息(XML注释和参数)使它更容易阅读。正如Blaise建议的那样,我还包括了@XmlElement标记(再次感谢)
我还包括(完成)XML的一部分,以便更好地了解发生了什么
这里我有一个如上所述的光纤连接
我有一张SC卡和一张光纤通道计划,它们在XML文档(选中)上之前已经被编组,但是它们正在被再次编组
作为交换,srcPort、srcChannel和fiberChannels之前也已编组,它们只有自己的ID
<OpticalRouter>
<fiberConnections>
<instanceID>FiberConnection@29e83b01</instanceID>
<srcCard xsi:type="DropCard" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<instanceID>DropCard@6b02b23d</instanceID>
<type>11</type>
<subtype>1</subtype>
<chasis>0</chasis>
<fiberChannelPlan xsi:type="ChannelPlan">
<instanceID>ChannelPlan@7e246b6d</instanceID>
<firstChannel>0</firstChannel>
<lastChannel>0</lastChannel>
<maxFreq>196.1</maxFreq>
<minFreq>191.6</minFreq>
<fiberChannels>Channel/360</fiberChannels>
<fiberChannels>Channel/368</fiberChannels>
<fiberChannels>Channel/376</fiberChannels>
<fiberChannels>Channel/384</fiberChannels>
</fiberChannelPlan>
<cardExpressPort>Port@4f781d1d</cardExpressPort>
<carCommonPort>Port@56bf83ad</carCommonPort>
</srcCard>
<srcPort>Port@56bf83ad</srcPort>
<srcChannel>Channel/184</srcChannel>
</fiberConnections>
</OpticalRouter>
我认为问题与我发现的帖子(即使我使用的是linux和java 1.6)或我在StarckOverflow上看到的其他帖子有关: JAVAnet/jira/browse/JAXB-870
提前谢谢
注:我使用的所有代码都是开源的,如果有人认为对他来说应该更容易的话,可以从git存储库的主要源代码下载
# 1 楼答案
您需要确保图形中的每个对象都是通过包含/嵌套关系(例如
@XmlElement
)引用的,这形成了XML。我看不出你的模型在哪里满足了这个要求。然后,您可以使用@XmlID/@XmlIDREF
在树中建立基于键的关系,将其转换为图形了解更多信息