我正在使用JAXB进行快速而脏的XML生成。我有一个代表树结构的类:
@XmlRootElement(name = "element")
public class Element {
// [...]
@XmlElementWrapper(name="childs")
@XmlElementRef
public List<Element> getChilds() { /*...*/ }
}
我想限制子集合编组的深度。所以,例如,我想写出我发送给Marshaller的元素的直接孩子,但省略他们的孩子。
是否有标准的JAXB方法可以执行此操作,或者可以使用回调来禁用动态编组属性?
答案 0 :(得分:1)
您可以尝试使用XmlJavaTypeAdapter注释和XmlAdapter界面的实现。
答案 1 :(得分:1)
如果你知道在编组之后你不会使用你的数据结构,或者你可以轻松地复制它,我会定义marshaller(http://java.sun.com/javase/6/docs/api/javax/xml/bind/Marshaller.html#marshalEventCallback)回调函数:
boolean beforeMarshal(Marshaller);
元素类中的。您可以使用此事件回调来跟踪编组程序已达到的深度。当它达到您的极限深度时,只需将带注释的子属性取消。默认情况下,JAXB在遇到null属性时不会生成元素,因此编组器将停在那里。
如果你想在编组后重复使用你的结构,你需要玩游戏,将你不想序列化的孩子移动到一个未注释的属性,然后在编组完成后将它们移回你的主属性:< / p>
void afterMmarshal(Marshaller);
这种模式增加了一点设计气味,因为你有一个带有魔法签名的未注释方法,它永远不会从你自己的代码中调用,但它确实有用。