我是 XML 的新手,遇到了一个我无法解决的问题,在环顾了几个小时后,我决定发布我的问题。
我正在使用 @XmlIDREF 来获取 XML 文档中某些 java 类的 XmlID。一切正常,但是当 JAXB 在树层次结构中查找 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 的一部分,以便更好地了解正在发生的事情。
在这里,我有一个如上所述的 fiberConnection。
我有一个scCard和一个FiberChannelPlan,之前已经在 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 上看到的其他帖子有关:java.net/jira/browse/JAXB-870
提前致谢!
PS:我使用的所有代码都是开源的,如果有人认为这对他来说应该更容易,可以从 git 存储库的主源下载。