7

我正在使用 JAXB(xjc 版本 2.2.4-2)从 XML 模式生成 Java 类。映射到 Java 原始数据类型的 XML 类型不添加:

@XmlElement(required = true)

例如使用时:

<element name="userId" type="long"/>
<element name="userName" type="string"/> 

将导致:

//no annotation added here
protected long userId;
@XmlElement(required = true)
protected String userName;

有没有人解释为什么会发生这种情况?

这是否与您可以使用 xjc 设置的选项有关?

4

2 回答 2

7

您不需要注释来显示需要 Java 类型的属性,long因为原始值不能为空这一事实是隐含的。一个不可空的必需元素xs:long映射到 Java long,一个可选的或可空的元素映射到java.lang.Long(它允许null,表示不存在或xsi:nil适当)。

一个可选又可空元素(奇数,但 XML Schema 允许)将映射到 aJAXBElement<Long>以区分缺席 (a ) 和 nil(返回 true的null JAXBElement非空)。JAXBElementisNil()

于 2012-12-10T12:59:28.093 回答
2

如果您不介意 Java 类中的 BigInteger,您可以使用 type="integer" 或 type="positiveInteger"(负 userId?)。您的验证将以一定的成本进行。

另一种选择是使用 jaxb 自定义绑定。您的元素可能是:

<element name="userId" type="long"/> 

并且您必须创建一个额外的绑定文件,例如

<jxb:bindings version="1.0" 
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
  jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="my.xsd" node="//xs:element[@name='UserType']//xs:element[@name='userId']">
 <jxb:property>
  <jxb:baseType name="java.lang.Long" />
 </jxb:property>
</jxb:bindings>
</jxb:bindings>

现在您可以像这样调用 xjc: xjc my.xsd -b my.xjb

这导致:

@XmlElement(required = true, type = Long.class) protected Integer userId;

于 2012-12-11T08:47:48.597 回答