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。これは、プリミティブ値を null にすることができないという事実から暗黙的であるためです。タイプの nillable でない必須要素はxs:longJava にマップされlong、オプションまたは nillable の要素は Java にマップされますjava.lang.Long(これはnull、存在しないか、または必要に応じて を表しxsi:nilます)。

オプションであり、nillable (奇妙ですが、XML スキーマで許可されている)である要素は、存在しない (a ) と nil (trueを返す非 null)を区別するために a にマップされます。JAXBElement<Long>null JAXBElementJAXBElementisNil()

于 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 に答える