JAXBContext和@XmlNsForm注释

时间:2011-09-06 09:38:48

标签: java jaxb xml-binding

请详细说明JAXBContext配置。 给出:

  • 客户库com.mycompany.user01234有几个 JAXB注释类
  • 所有类都是位于同一个包中的简单POJO
  • 类由@XmlType
  • 注释

客户通过Web服务端点将com.mycompany.user01234.UserClass1.class的实例编组到服务器。在服务器端,我执行以下操作:

JAXBContext jbc = JAXBContext.newInstance("com.mycompany.user01234")
Unmarshaller um = jbc.createUnmarshaller();
JAXBElement<Object> element = um.unmarshal(source, Object.class);
Object customerInput = element.getValue();

如果我使用以下package-info.java修补客户资料库,它的工作正常

@XmlSchema(elementFormDefault = XmlNsForm.QUALIFIED)
package com.mycompany.user01234;

令我遗憾的是,我没有找到任何关于这个@XmlNsForm注释是什么以及它如何影响解组过程的明确解释。这是第一个问题。

第二个问题是(在给定的布局中)是否有可能将QUALIFIED值放入JAXBContext的某些属性或默认值中,或者使用其他非声明性方法来释放{ {1}}。

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

它完全对应于elementFormDefault元素的<xs:schema>属性(即XML Schema文档的顶级元素)。它的作用(使用该常量)是指由模式定义的命名空间中的元素应该使用限定符(即<foo:bar>而不是<bar>)来呈现;声明命名空间的确切方式也会因两种样式而异。就XML信息集而言,这两种风格完全相同;如果在XML中正确声明了名称空间,JAXB应该同样高兴(我相信它应该只在序列化时使用该值)。

您可能希望通过传入您期望的类来尝试创建JAXBContext,这样您就不再依赖于发现代码(假设它是一个真正生成的FooBar类) :

JAXBContext jbc = JAXBContext.newInstance(FooBar.class);
FooBar customerInput = (FooBar) jbc.createUnmarshaller().unmarshal(source);

(上面的代码是从我在代码的测试套件中执行的操作中抽象出来的,肯定已经正常工作。)