JAXB – 在编组XML时可以将类包含展平吗?
说,我有两个class:
@XmlRootElement class A { @XmlElement String propertyOfA; @XmlElement B b; } class B { @XmlElement String propertyOfB; }
JAXB返回以相应方式格式化的XML:
valueA valueB
我的问题是如何在XML中展平层次结构? 所以我有:
valueA valueB
这可以用注释完成吗?
目前我正在考虑为A创建一种包装类,它将按照我希望在XML中查看它们的方式构建字段。 有没有更好的办法?
注意:我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2(JSR-222)专家组的成员。
您可以使用MOXy的@XmlPath
扩展来映射此用例:
import java.xml.bind.annotation.*; import org.eclipse.persistence.oxm.annotations.XmlPath; @XmlRootElement class A { @XmlElement String propertyOfA; @XmlPath(".") B b; }
了解更多信息
对我来说已经有一段时间了,但是让我给它一个解决方案:
@XmlRootElement class A { @XmlElement String propertyOfA; @XmlElement(name="propertyOfB") B b; } @XmlType(name="") class B { @XmlValue String propertyOfB; }
编辑:免责声明 – 我没有编译或试过这个。 但我相信你是这样做的。
看看那个问题和建议的解决方案: Spring RESTful客户端:root标签exception
非常有助于解决这类问题。
另一种方法(使用标准JAXB)将使用@XmlJavaTypeAdapter
。 这样,您可以调整对象层次结构,其缺点是必须编写将对象层次结构转换为适应的新类的代码。 在你的例子中,它不会起作用,因为你必须适应作为你的根的A类。 但是,如果层次结构更深,并且您需要使适应性比根低一级,则不会出现问题。 一个可能有用的建议是在适应的实体中编写代码,使其成为对象层次结构的委托,而不是适配器,后者将非常薄。