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类。 但是,如果层次结构更深,并且您需要使适应性比根低一级,则不会出现问题。 一个可能有用的建议是在适应的实体中编写代码,使其成为对象层次结构的委托,而不是适配器,后者将非常薄。