Hitachi

Cosminexus V11 アプリケーションサーバ Cosminexus XML Processor ユーザーズガイド


6.20.4 実行時の注意事項

実行時の注意事項を次の表に示します。

表6‒46 JAXBに関する注意事項(実行時)

項番

注意事項

1

マルチスレッドプログラミングをする場合,javax.xml.bindで始まる名前のパッケージで規定されたオブジェクトはスレッドセーフではありません(例外として,javax.xml.bind.JAXBContextクラスはスレッドセーフです)。したがって,複数のスレッドが同時にこれらのオブジェクトにアクセスしてはいけません。スレッド間の競合を避けるため,次の方法を使用してください。

  • 各スレッドが排他的にこれらのオブジェクトにアクセスする。

2

アンマーシャル,マーシャル時には,製品の内部でスキーマジェネレータと類似の処理が実行される場合があります。したがって,スキーマジェネレータの注意事項も参照してください。

3

xs:ENTITY型またはxs:ENTITIES型を使用したスキーマ文書を検証モードでアンマーシャルまたはマーシャルを実行しないでください。実行した場合,エンティティが宣言されていないというエラーが発生します。

(例)

KECX06252-E UndeclaredEntity: Entity 'id1' is not declared.

4

[条件]

次のすべての条件に該当する場合です。

  • Unmarshallerのunmarshal(org.w3c.dom.Node node)メソッドを実行する。

  • nodeパラメタにorg.w3c.dom.Documentまたはorg.w3c.dom.Element以外のNodeオブジェクトを指定する。

[XML Processorの動作]

IllegalArgumentException例外が発生します。

(例)

java.lang.IllegalArgumentException: Unexpected node type: [#text: String]

5

[条件]

次のすべての条件に該当する場合です。

  • 例外をスローする整列化イベントコールバックメソッド(beforeMarshal/afterMarshal)をクラスに定義する。

  • 上記イベントコールバックメソッドが呼ばれるインスタンス文書を出力するようなマーシャルを実行する。

[XML Processorの動作]

マーシャルプロセスは終了しますが,IllegalStateException例外がスローされます。

6

[条件]

次のすべての条件に該当する場合です。

  1. パッケージレベルで@XmlJavaTypeAdapterを指定する。

  2. クラスまたは列挙型に対し@XmlJavaTypeAdapterを指定する。

  3. インスタンス文書に1.および2.で指定した@XmlJavaTypeAdapterが有効となるデータ型定義がある。

  4. 1.3.の条件のもとでアンマーシャルまたはマーシャルを実行する。

[XML Processorの動作]

クラス,列挙型に対する@XmlJavaTypeAdapterよりも,そのクラスのパッケージレベルで指定された @XmlJavaTypeAdapterが優先されます。動作が標準仕様と異なるため,このようなjavaソースは処理対象としないでください。

7

[条件]

handleEventメソッドの中でJavaコンテンツツリーを変更した場合です。

[XML Processorの動作]

MarshalExceptionをスローします。

8

[条件]

次のすべての条件に該当する場合です。

  1. マーシャルを実行する。

  2. marshalメソッドの引数jaxbElementがJAXBElementオブジェクトである。

  3. 2.のJAXBElementコンストラクタのnameパラメタに指定したQNameオブジェクトのlocalPart,prefixのどちらかがNCNameではない。

[XML Processorの動作]

marshalメソッドは正常終了しますが,整形式ではないXML文書が生成されます。

9

[条件]

次のすべての条件に該当する場合です。

  1. @XmlEnumのvalue要素がjavax.xml.namespace.QName.classである。

  2. @XmlEnumValueのvalue要素がQNameを表すリテラル文字列である。

  3. JAXBContext.newInstance()メソッドの引数に,1.および2.を含むJavaクラスを指定して実行する。

[XML Processorの動作]

JAXBException例外が発生します。このようなjavaソースは処理対象としないでください。

10

[条件]

次のすべての条件に該当する場合です。

  • ValidationEventLocatorインタフェースのgetURLメソッドを実行する。

  • アンマーシャル対象のオブジェクトのURLが,RFC2396に指定できない文字を含んでいる(ディレクトリ名,ファイル名からURLが自動生成される場合も含む)。

[XML Processorの動作]

getURLメソッドの戻り値は,RFC2396で指定できない文字をそのまま含みます。

11

[条件]

次のすべての条件に該当する場合です。

  1. 型がプリミティブ型であるstaticフィールドに,@XmlAttributeを指定する。

  2. 1.のJavaソースをマーシャルする。

[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

[条件]

次のすべての条件に該当する場合です。

  1. インスタンス文書の要素にxsi:type属性の指定がある。

  2. 1.に指定された型がJAXBマップ型でない。

  3. 1.2.でアンマーシャルを実行する。

[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

[条件]

次のすべての条件に該当する場合です。

  1. スキーマ文書で「デフォルト値が指定されているxs:list型の要素」を宣言している。

  2. 1.をスキーマコンパイラに適用し,生成されたJava値クラスを用いてXML文書をアンマーシャルする。

  3. 2.のJava値クラスのインスタンスをgetメソッドで取得する。

[XML Processorの動作]

取得したインスタンスには,スキーマ文書で定義したデフォルト値が含まれません。

19

[条件]

次のすべての条件に該当する場合です。

  1. @XmlAttachmentRefをフィールド,JavaBeanプロパティ,パラメタのどれかに付ける。

  2. 1.のJavaソースをスキーマジェネレータに入力する。

  3. 2.で生成したスキーマ文書で妥当性検証を実行する。

[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

[条件]

次のすべての条件に該当する場合です。

  1. jaxb:typesafeEnumClassカスタムバインディングを指定する。

  2. 1.のスキーマ文書をスキーマコンパイラに入力する。

  3. 2.で列挙型のfromValueメソッドが生成され,その引数に列挙定数以外を指定して呼び出す。

[XML Processorの動作]

IllegalArgumentException例外が発生します。

21

[条件]

次のすべての条件に該当する場合です。

  • package-info.javaが存在する。

  • JAXBContext.newInstance(Class... classesToBeBound)を実行後,スキーマ生成やアンマーシャル,マーシャルのメソッドを実行する。

[XML Processorの動作]

package-info.javaを事前にコンパイルしていない場合,処理対象となりません。

22

[条件]

次のすべての条件に該当する場合です。

  • @XmlAnyElement(lax = true)を,Object型のフィールドまたはJavaBeanプロパティのどちらかに付加する。

  • 要素がスキーマ要素定義に一致しないが,その要素のxsi:type属性に指定された型名がスキーマで定義されているインスタンス文書をアンマーシャルする。

[XML Processorの動作]

JAXBオブジェクト(スキーマ要素定義に対応するJavaクラスのオブジェクト)が生成されないで,DOMノードが生成されます。

23

[条件]

次に示すどれかのクラスで,setEventHandlerメソッドの引数にnullを指定する場合です。

  • Unmarshallerクラス

  • Marshallerクラス

  • Binder<Node>クラス

[XML Processorの動作]

getEventHandlerメソッドで取得したイベントハンドラは,setEventHandlerメソッドを実行しなかった場合のイベントハンドラと異なり,JAXB1.0のデフォルトイベントハンドラ(DefaultValidationEventHandler)となります。このような指定をした場合の動作は保証しません。

24

[条件]

次のすべての条件に該当する場合です。

  • Binder<Node>クラスのsetPropertyメソッドで,jaxb.encodingプロパティにデフォルト以外の値を設定する。

  • Binder<Node>クラスのmarshalメソッドを実行する。

[XML Processorの動作]

設定されたプロパティは有効となりません。

25

[条件]

次のすべての条件に該当する場合です。

  • Binder<Node>クラスのsetPropertyメソッドでjaxb.formatted.outputプロパティを設定しない,またはfalseの値を設定する。

  • Binder<Node>クラスのmarshalメソッドを実行する。

[XML Processorの動作]

プロパティの設定に関係なく,改行およびインデントが処理されたXMLデータが出力されます。

26

[条件]

javax.xml.bind.Binder<XmlNode>クラスのunmarshal(XmlNode xmlNode, Class<T> declaredType)に,次のように指定する場合です。

  • declaredTypeに指定したクラスに一致しないxmlNodeを指定する。

[XML Processorの動作]

例外は発生しません。このような場合のJAXB実行時の動作は規定されていないため,保証しません。

27

[条件]

javax.xml.bind.Binder<XmlNode>クラスのupdateXML(Object jaxbObject, XmlNode xmlNode)に,次のように指定する場合です。

  • 引数jaxbObjectにunmarshalおよびmarshalで関連づけられていない,JAXBオブジェクトを指定する。

  • 引数xmlNodeに関連づけられたあとに削除されたDOMノードを指定する。

[XML Processorの動作]

このような場合のJAXB実行時の動作は規定されていないため,保証しません。

28

[条件]

javax.xml.bind.Binder<XmlNode>クラスのupdateXMLメソッドを実行する場合です。

[XML Processorの動作]

JAXBオブジェクトに関連づけられた既存のXMLツリーを更新しないで,新しいXMLツリーが作成されます。そのため,既存のXMLツリーに次の情報が含まれる場合,それらの情報はメソッド実行後保持されません。

  • コメント

  • PI

  • JAXBにバインドされない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データの文字列をターゲットのJavaデータ型の値に変換している途中で,問題が発生した。

  • マーシャル時,JavaコンテンツツリーのデータをJavaコンテンツツリーの字句表現に変換している途中で,問題が発生した。

[XML Processorの動作]

イベント(アンマーシャル時のparseConversionEvent,またはマーシャル時のprintConversionEvent)は生成されません。

31

[条件]

次のすべての条件に該当する場合です。

  1. XML文書にxsi:type属性を指定する。

  2. 1.の属性値に,要素名および属性名で使用していない名前空間接頭辞を指定する。

  3. 1.のXML文書をアンマーシャルする。

  4. 3.でアンマーシャルしたオブジェクトを検証モードでマーシャルする。

(例)

<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

[条件]

次のすべての条件に該当する場合です。

  1. フィールドAがjava.util.Calendarクラスとして宣言されている。

  2. 1.のフィールドが@XmlSchemaType(name="date")を使ってアノテーションされている。

  3. 1.および2.に該当するフィールドを持つクラスをマーシャルする。

[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になります。