有没有办法限制JAXB中对象图的编组深度?

时间:2009-11-10 12:45:28

标签: java xml jaxb

我正在使用JAXB进行快速而脏的XML生成。我有一个代表树结构的类:

@XmlRootElement(name = "element")
public class Element {

  // [...]

  @XmlElementWrapper(name="childs")
  @XmlElementRef
  public List<Element> getChilds() { /*...*/ }
}

我想限制子集合编组的深度。所以,例如,我想写出我发送给Marshaller的元素的直接孩子,但省略他们的孩子。

是否有标准的JAXB方法可以执行此操作,或者可以使用回调来禁用动态编组属性?

2 个答案:

答案 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);

这种模式增加了一点设计气味,因为你有一个带有魔法签名的未注释方法,它永远不会从你自己的代码中调用,但它确实有用。