说我有两个JavaBeans Person和Address.
如果我创建一个Person对象列表,我想编组这样的东西:
<persons>
<person>...</person>
</persons>
Run Code Online (Sandbox Code Playgroud)
可以使用此处描述的技术: 使用JAXB解组/编组List <String>
通过使用@XmlRootElement(name = "persons")和注释JaxbList,@XmlElement(name = "person")可以编组上面的XML.
但是,能够重用同一个JaxbList<T>类来编组Address对象列表会很好.实际上,我会有很多其他类型的豆子.我可以用以下的东西:
<list>
<item xsi:type="person" xmlns:xsi="http://www.w2.org/2001/XmlSchema-instance"></item>
</list>
Run Code Online (Sandbox Code Playgroud)
但是,理想情况下,将"list"替换为复数版本的类名称和"item"替换为类名称会很好.
那么,是否有可能在运行时以编程方式配置JaxbContext或其他东西,并基本上设置name内部的值@XmlRootElement和@XmlElement?
或者任何其他方式让这个工作,而不必JaxbList为每个bean类型编写单独的实现?也许XmlJavaTypeAdapter可以实现这种事情?
更新 @Blaise Doughan在下面接受的解决方案非常有用.对于我的用例,我需要直接从Java对象到XML,这里有用(注意这不是我的完整实现,它只是用于演示的伪代码):
//JAXBContext is thread safe and so create it in constructor or
//setter or wherever:
...
JAXBContext jc = JAXBContext.newInstance(Wrapper.class, clazz);
...
public String marshal(List<T> things, Class clazz) {
//configure JAXB and marshaller
Marshaller m = …Run Code Online (Sandbox Code Playgroud) 我在JBoss AS 6中通过RestEasy使用JAX-RS.当我的JAX-RS资源返回一组项目时(例如通过List),RESTEasy总是使用该名称collection作为根元素.
例如
<collection>
<item>
<description>computer</description>
<price>2500</price>
</item>
<item>
<description>tv</description>
<price>1500</price>
</item>
</collection>
Run Code Online (Sandbox Code Playgroud)
此XML由以下内容生成:
@Produces("application/xml")
@Path("xml")
@RequestScoped
public class MyResource {
@GET
@Path("myitems")
public List<Item> getMyItems() {
return ...
}
}
Run Code Online (Sandbox Code Playgroud)
可以看出,RESTEasy创建的根标记始终是<collection>.
另一方面,泽西岛总是创建一个名称,该名称是列表中包含的元素的复数形式:
<items>
<item>
<description>computer</description>
<price>2500</price>
</item>
<item>
<description>tv</description>
<price>1500</price>
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
我知道可以创建一个包装器类型并返回而不是List,但这是一个相当精细的解决方法,并使代码更复杂.
是否可以轻松指定集合的根标签名称?