说,我有两个班:
@XmlRootElement
class A {
@XmlElement
String propertyOfA;
@XmlElement
B b;
}
class B {
@XmlElement
String propertyOfB;
}
JAXB返回以相应方式格式化的XML:
<a>
<propertyOfA>valueA</propertyOfA>
<b>
<propertyOfB>valueB</propertyOfB>
</b>
</a>
我的问题是如何在XML中展平层次结构?所以我有:
<a>
<propertyOfA>valueA</propertyOfA>
<propertyOfB>valueB</propertyOfB>
</a>
这可以通过注释完成吗?
目前我正在考虑为A创建一种包装类,这将使我希望在XML中看到它们的方式构建字段。还有更好的方法吗?
答案 0 :(得分:4)
对我来说已经有一段时间了,但让我试试看:
@XmlRootElement
class A {
@XmlElement
String propertyOfA;
@XmlElement(name="propertyOfB")
B b;
}
@XmlType(name="")
class B {
@XmlValue
String propertyOfB;
}
编辑:免责声明 - 我没有编译或试过这个。但我相信你是这样做的。
答案 1 :(得分:4)
注意:我是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;
}
了解更多信息
答案 2 :(得分:0)
看看那个问题和建议的解决方案:Spring RESTful client: root tag exception
非常有助于解决此类问题。
答案 3 :(得分:0)
另一种方法(使用标准JAXB)将使用@XmlJavaTypeAdapter
。这样,您可以调整对象层次结构,其缺点是必须编写将对象层次结构转换为适应的新类的代码。
在你的例子中,它不会起作用,因为你必须适应作为你的根的A类。但是,如果层次结构更深,并且您需要使适应性比根低一级,那么就不会有问题。一个可能有用的建议是在适应的实体中编写代码,使其成为对象层次结构的委托,而不是适配器,后者将非常薄。