是否可以以编程方式配置 JAXB?
假设我有两个 JavaBean 和 .Person
Address
如果我创建 Person 对象的列表,我想封送如下:
<persons>
<person>...</person>
</persons>
可以使用此处描述的技术:使用 JAXB 取消元帅/封送 List<String>
通过使用 和 对 JaxbList 进行注释,则可以封送至上面的 XML。@XmlRootElement(name = "persons")
@XmlElement(name = "person")
但是,如果能够重用同一类来封送对象列表,那就太好了。实际上,我会有很多其他类型的豆子。我可以像这样:JaxbList<T>
Address
<list>
<item xsi:type="person" xmlns:xsi="http://www.w2.org/2001/XmlSchema-instance"></item>
</list>
但是,理想情况下,最好将“list”替换为类名的复数版本,将“item”替换为类名。
那么,是否可以在运行时以编程方式配置JaxbContext或其他东西,并基本上设置内部和的值?name
@XmlRootElement
@XmlElement
或者任何其他方法来让它工作,而不必为每个bean类型编写单独的实现?也许XmlJavaTypeAdapter可以实现这种事情?JaxbList
更新@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 = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//Create wrapper based on generic list of objects
Wrapper<T> wrapper = new Wrapper<T>(things);
JAXBElement<Wrapper> wrapperJAXBElement = new JAXBElement<Wrapper>(new QName(clazz.getSimpleName().toLowerCase()+"s"), Wrapper.class, wrapper);
StringWriter result = new StringWriter();
//marshal!
m.marshal(wrapperJAXBElement, result);
return result.toString();
}