6.20.4 実行時の注意事項
実行時の注意事項を次の表に示します。
項番 |
注意事項 |
---|---|
1 |
マルチスレッドプログラミングをする場合,javax.xml.bindで始まる名前のパッケージで規定されたオブジェクトはスレッドセーフではありません(例外として,javax.xml.bind.JAXBContextクラスはスレッドセーフです)。したがって,複数のスレッドが同時にこれらのオブジェクトにアクセスしてはいけません。スレッド間の競合を避けるため,次の方法を使用してください。
|
2 |
アンマーシャル,マーシャル時には,製品の内部でスキーマジェネレータと類似の処理が実行される場合があります。したがって,スキーマジェネレータの注意事項も参照してください。 |
3 |
xs:ENTITY型またはxs:ENTITIES型を使用したスキーマ文書を検証モードでアンマーシャルまたはマーシャルを実行しないでください。実行した場合,エンティティが宣言されていないというエラーが発生します。 (例) KECX06252-E UndeclaredEntity: Entity 'id1' is not declared. |
4 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] IllegalArgumentException例外が発生します。 (例) java.lang.IllegalArgumentException: Unexpected node type: [#text: String] |
5 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] マーシャルプロセスは終了しますが,IllegalStateException例外がスローされます。 |
6 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] クラス,列挙型に対する@XmlJavaTypeAdapterよりも,そのクラスのパッケージレベルで指定された @XmlJavaTypeAdapterが優先されます。動作が標準仕様と異なるため,このようなjavaソースは処理対象としないでください。 |
7 |
[条件] handleEventメソッドの中でJavaコンテンツツリーを変更した場合です。 [XML Processorの動作] MarshalExceptionをスローします。 |
8 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] marshalメソッドは正常終了しますが,整形式ではないXML文書が生成されます。 |
9 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] JAXBException例外が発生します。このようなjavaソースは処理対象としないでください。 |
10 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] getURLメソッドの戻り値は,RFC2396で指定できない文字をそのまま含みます。 |
11 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] マーシャル時に不当な例外が発生します。このようなjavaソースは処理対象としないでください。 (例) Exception in thread "main" java.lang.IncompatibleClassChangeError |
12 |
[条件] Java値クラスのsetterメソッドの引数にnullを指定する場合です。 [XML Processorの動作] NullPointerExceptionが発生します。 [回避策] setterメソッド呼び出し部分のコードを,次のように変更してください。 (変更前) items.setId(null); (変更後) items.setId(new String[] {}); |
13 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] アンマーシャルが正常終了します。 要素は,xsi:typeによる型の置換をしないでアンマーシャルされます。 |
14 |
検証モードのマーシャル実行でエラーが発生した場合,エラーになる前までの内容の不正なXML(非整形なXML)が出力される場合があります。 |
15 |
jaxb.formatted.outputプロパティを指定してマーシャルを実行したとき,出力されるXML文書の改行コードは0x0Aになります。 |
16 |
マーシャルを実行したとき,出力されるXML文書のXML宣言にstandalone="yes" 擬似属性が出力されます。 |
17 |
[条件] Marshallerインタフェースのmarshal(Object jaxbElement,Node node)メソッドの引数nodeにElement,Document,DocumentFragment以外のNodeオブジェクトを指定する場合です。 [XML Processorの動作] DOMExceptionを例外スローします。 (例) org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: KECX01304-E An attempt was made to insert a node where it is not permitted. |
18 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] 取得したインスタンスには,スキーマ文書で定義したデフォルト値が含まれません。 |
19 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] 生成されるスキーマの要素定義,属性定義での,type属性値は{http://ws-i.org/profiles/basic/1.1/xsd}swaRefになります。 名前空間{http://ws-i.org/profiles/basic/1.1/xsd}の定義は次に示すxs:importとして生成されます。 <xs:import namespace="http://ws-i.org/profiles/basic/1.1/xsd" schemaLocation="http://ws-i.org/profiles/basic/1.1/swaref.xsd"/> このため,生成したスキーマ文書で妥当性検証を実行すると,XMLパーサがhttpプロトコルを用いてhttp://ws-i.org/profiles/basic/1.1/swaref.xsdを参照します。javax.xml.validation.Validator#setResourceResolverメソッドを使用して適切なorg.w3c.dom.ls.LSResourceResolverインスタンスを設定することで,任意の場所に存在するswaref.xsdを参照させることができます。 |
20 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] IllegalArgumentException例外が発生します。 |
21 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] package-info.javaを事前にコンパイルしていない場合,処理対象となりません。 |
22 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] JAXBオブジェクト(スキーマ要素定義に対応するJavaクラスのオブジェクト)が生成されないで,DOMノードが生成されます。 |
23 |
[条件] 次に示すどれかのクラスで,setEventHandlerメソッドの引数にnullを指定する場合です。
[XML Processorの動作] getEventHandlerメソッドで取得したイベントハンドラは,setEventHandlerメソッドを実行しなかった場合のイベントハンドラと異なり,JAXB1.0のデフォルトイベントハンドラ(DefaultValidationEventHandler)となります。このような指定をした場合の動作は保証しません。 |
24 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] 設定されたプロパティは有効となりません。 |
25 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] プロパティの設定に関係なく,改行およびインデントが処理されたXMLデータが出力されます。 |
26 |
[条件] javax.xml.bind.Binder<XmlNode>クラスのunmarshal(XmlNode xmlNode, Class<T> declaredType)に,次のように指定する場合です。
[XML Processorの動作] 例外は発生しません。このような場合のJAXB実行時の動作は規定されていないため,保証しません。 |
27 |
[条件] javax.xml.bind.Binder<XmlNode>クラスのupdateXML(Object jaxbObject, XmlNode xmlNode)に,次のように指定する場合です。
[XML Processorの動作] このような場合のJAXB実行時の動作は規定されていないため,保証しません。 |
28 |
[条件] javax.xml.bind.Binder<XmlNode>クラスのupdateXMLメソッドを実行する場合です。 [XML Processorの動作] JAXBオブジェクトに関連づけられた既存のXMLツリーを更新しないで,新しいXMLツリーが作成されます。そのため,既存のXMLツリーに次の情報が含まれる場合,それらの情報はメソッド実行後保持されません。
また,updateXML(Object jaxbObject, XmlNode xmlNode)メソッドの戻り値は,引数のxmlNodeと同じノードにはなりません。そのため,updateXMLメソッドを繰り返し実行する場合,引数xmlNodeに同じ値を指定しないでください。 |
29 |
[条件] javax.xml.bind.Binder<XmlNode>クラスのupdateXMLメソッドを実行する場合です。 [XML Processorの動作] javax.xml.bind.Binder<XmlNode>クラスの実装が持つ,JAXBオブジェクトツリーとXMLノードの関連づけが不正になります。 そのため,メソッド実行後,戻り値をgetJAXBNode(XmlNode xmlNode)の引数に指定した実行結果は,nullとなります。また,updateXMLメソッドを繰り返し実行した場合,NullPointerException例外が発生します。 [回避策] 次のように変更し,updateXMLメソッドの呼び出しに加えて,javax.xml.bind.Binder<XmlNode>クラスのupdateJAXBメソッドの呼び出しを実施してください。 (変更前) binder.updateXML(rootbinder); (変更後) Node node = binder.updateXML(rootbinder); rootbinder = (Root)binder.updateJAXB(node); |
30 |
[条件] 次のどちらかの条件に該当する場合です。
[XML Processorの動作] イベント(アンマーシャル時のparseConversionEvent,またはマーシャル時のprintConversionEvent)は生成されません。 |
31 |
[条件] 次のすべての条件に該当する場合です。
(例) <foo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <a/> <b xsi:type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema">abc</b> <c xsi:type="xsd:int" xmlns:xsd="http://www.w3.org/2001/XMLSchema">123</c> </foo> [XML Processorの動作] KECX06253-E UndeclaredPrefix: Cannot resolve 'xsd:string' as a QName: the prefix 'xsd' is not declared.のエラーが報告されます。 また,検証モードなしでマーシャルを実施すると,必要な名前空間宣言がないXML文書が出力されます。 |
32 |
[条件] 次のすべての条件に該当する場合です。
[XML Processorの動作] フィールドAに対応するXML文書中の要素の内容が,xs:date型ではなく,xs:dateTime型として出力されます。 そのため,JAXBContextクラスのgenerateSchemaメソッドで生成したスキーマを使用してスキーマ検証すると,検証エラーになります。 [回避策] マーシャル時にxs:date形式で出力したい場合には,java.util.Calendarクラスではなく,javax.xml.datatype.XMLGregorianCalendarクラスを使用してください。 |
33 |
[条件] ValidationEventLocatorインタフェースのgetOffsetメソッドを実行する場合です。 [XML Processorの動作] getOffsetメソッドの戻り値は,常に-1になります。 |