付録A.6 JAXBの動作の差異

JAXBの動作の差異を,状況別に次の表に示します。

表A-7 JAXBの動作の差異(csmxjcコマンド)

項番条件Cosminexus XML Processorの動作
バージョン08-50の場合バージョン08-70の場合
1enumerationファセットが存在しないXMLスキーマ文書の単純型にtypesafeEnumClassカスタムバインディングが存在する場合csmxjcコマンドが正常終了します。typesafeEnumClassカスタムバインディングの指定が不正であることを示すエラーが発生します。
2次のどちらかの場合に該当するとき
  • globalBindingsカスタムバインディングで,generateElementClass="true"またはgenerateElementClass="1"を指定した場合
  • XMLスキーマ文書のelement要素にclassカスタムバインディングを指定した場合
要素クラスの参照プロパティは,要素のデータ型(@XmlElementまたは@XmlElements)で注釈されます。
なお,その要素に対応するソースにデフォルトコンストラクタは出力されません。
要素クラスの参照プロパティは,要素のクラス型(@XmlElementRefまたは@XmlElementRefs)で注釈されます。
デフォルトコンストラクタが出力されます。
3group要素中のelement要素にclassカスタムバインディングを指定して,そのgroup要素がほかの複数の型から参照されている場合group要素中のelement要素のうち,classカスタムバインディング指定されていない要素のオブジェクトを作成するファクトリメソッドは,生成されません。group要素中のelement要素のうち,classカスタムバインディング指定されていない要素のオブジェクトを作成するファクトリメソッドが,生成されます。
4globalBindingsまたはpropertyカスタムバインディングにcollectionType="indexed"の指定がある場合csmxjcコマンドで生成したソースのelement要素に対する型は,java.util.Listです。csmxjcコマンドで生成したソースのelement要素に対する型は,配列です。
5型定義や匿名型要素定義にfactoryMethodカスタムバインディングの指定がある状態でcsmxjcコマンドを実行した場合エラーになります。正常終了します。
6csmxjcコマンドで生成したソースに@XmlElementRef注釈型が含まれる場合required要素は出力されません。required要素が出力されます。
7@XmlAttribute注釈型のname要素が生成するフィールド名と同じ場合name要素は出力されません。name要素が出力されます。
注※
@XmlElementRef注釈型のrequired要素は,JAXB 2.2でサポートされました。

表A-8 JAXBの動作の差異(csmschemagenコマンド)

項番条件Cosminexus XML Processorの動作
バージョン08-50の場合バージョン08-70の場合
1Javaソースに@XmlAccessorOrderまたは@XmlAccessorOrder(XmlAccessOrder.UNDEFINED)を指定した場合csmschemagenコマンドで作成したXMLスキーマ文書がsequence要素になります。csmschemagenコマンドで作成したXMLスキーマ文書がall要素になります。
2Javaソースに@XmlElementDeclを指定した場合csmschemagenコマンドで生成したXMLスキーマ文書の大域定義のelement要素に,nillable="true"属性が出力されます。csmschemagenコマンドで生成したXMLスキーマ文書の大域定義のelement要素に,nillable="true"属性は出力されません。

表A-9 JAXBの動作の差異(実行時)

項番条件Cosminexus XML Processorの動作
バージョン08-50の場合バージョン08-70の場合
1@XmlAttribute注釈型または@XmlValue注釈型で注釈されたjava.lang.Object型の変数が存在するクラス,またはそのクラスが存在するパッケージ名を,JAXBContextクラスのnewInstanceメソッドに指定した場合IllegalAnnotationsExceptionがスローされます。NullPointerExceptionがスローされます。
2JAXBContextクラスのnewInstanceメソッドに指定したパッケージにpackage-infoクラスが存在し,XmlNs注釈型で名前空間が指定されている場合marshalで出力されるXML文書に名前空間宣言が出力されません。marshalで出力されるXML文書に名前空間宣言が出力されます。
3@XmlMixed注釈型で注釈されたJavaBeanプロパティに空白類だけのテキストが含まれるXML文書をアンマーシャルした場合アンマーシャルで生成されたオブジェクトにテキストオブジェクトが生成されません。空白類だけのテキストオブジェクトが生成されます。
4スキーマ検証やイベントハンドラで,エラーチェックをしないUnmarshallerで数値のプリミティブ型のJavaBeanプロパティに,文字列をアンマーシャルした場合IllegalAccessErrorとなります。アンマーシャルが正常終了します。
5JAXBにマッピングされたクラスにbeforeUnmarshalメソッドまたはafterUnmarshalメソッドを実装して,アンマーシャル実行時にそのメソッドで例外がスローされた場合アンマーシャル処理は中断しません。UnmarshalExceptionがスローされて,アンマーシャル処理が中断します。
6JAXBContextクラスのnewInstance(Class[], Map<String, ?>)メソッドおよびnewInstance(Class[])メソッドの第1パラメタにnullを指定した場合NullPointerExceptionがスローされます。IllegalArgumentExceptionがスローされます。
7DatatypeConverterクラスのparseBooleanメソッドに"0","1","false","true"以外を指定した場合falseが返ります。IllegalArgumentExceptionがスローされます。
8DatatypeConverterクラスのparseDecimalメソッドに空白だけを指定した場合java.lang.NumberFormatExceptionがスローされます。例外はスローされません。
9enumクラスにアンマーシャルする値に改行や空白が含まれる場合処理結果が不正になります。値が正しくアンマーシャルされます。