繁体   English   中英

使用JAXB生成Java基元类型的XML Schema类型不需要添加

[英]XML Schema type that generates Java primitive type using JAXB doesn't add required to it

我正在使用JAXB(xjc版本2.2.4-2)从XML Schema生成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设置的选项有关吗?

您不需要注释来显示需要Java类型long的属性,因为原始值不能为null这是隐含的。 xs:long类型的非可填充必需元素xs:long映射到Java long ,可选或可填写的元素映射到java.lang.Long (允许null ,表示缺席或xsi:nil视情况而定)。

可选的,并且的nillable(奇数,而是由XML模式允许的)的元件将映射到一个JAXBElement<Long>不存在之间进行区分(一个null JAXBElement )和零(一个非空JAXBElementisNil()返回true)。

如果您不介意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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM