1

请阐明 JAXBContext 配置。鉴于:

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

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

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或使用其他非声明性方式允许摆脱package-info.java.

提前谢谢了!

4

1 回答 1

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);

(上面的代码是从我在代码的测试套件中所做的事情中抽象出来的,这些事情肯定已经可以工作了。)

于 2011-09-06T12:48:16.227 回答