構成エレメントのマージ・ルール
サーバー構成で 1 つの構成エレメントが複数回指定されている場合、それらのエレメントはマージされます。構成のマージには、以下のルールが適用されます。
- シングルトン・エレメントは常にマージされます。以下の例では、サーバー構成内のエレメントのすべてのインスタンスが、featureManager でマージされ、単一の featureManager エレメントを形成しています。
実効構成は以下のようになります。<featureManager> <feature>servlet-3.0</feature> </featureManager> <featureManager> <feature>jdbc-4.0</feature> </featureManager>
<featureManager> <feature>servlet-3.0</feature> <feature>jdbc-4.0</feature> </featureManager>
- サーバー構成の最上位で指定されたファクトリー・エレメントは、ID が同じである場合、マージされます。以下の例では、id= "ds1" である dataSource エレメントがマージされ、 id= "ds2" の dataSource エレメントはそのままになっています。以下に例を示します。
実効構成は以下のようになります。<dataSource id="ds1" jdbcDriverRef="myDriver"/> <dataSource id="ds1" jndiName="jdbc/myDriver"/> <dataSource id="ds2" jdbcDriverRef="myDriver2"/>
<dataSource id="ds1" jdbcDriverRef="myDriver" jndiName="jdbc/myDriver"/> <dataSource id="ds2" jdbcDriverDref="myDriver2"/>
- ファクトリー・エレメントに ID 値がない場合、ID 値がない同じタイプの他のエレメントとは異なるものと見なされます。ID 値がないファクトリー・エレメントが複数あっても、一緒にマージされません。以下の例では、dataSource はマージされないため、実効構成は、指定されている構成と同じになります。
実効構成は以下のようになります。<dataSource jdbcDriverRef="myDriver"/> <dataSource jndiName="jdbc/myDriver"/>
<dataSource jdbcDriverRef="myDriver"/> <dataSource jndiName="jdbc/myDriver"/>
- マージされるエレメントに競合する属性がある場合、マージされたエレメントは、構成パーサーで検出された最後の値を使用します。以下の例では、id= "ds1" の dataSource エレメントがマージされ、jdbcDriverRef="myDriver2" が使用され、jdbcDriverRef="myDriver" が削除されます。
実効構成は以下のようになります。<dataSource id="ds1" jdbcDriverRef="myDriver"/> <dataSource id="ds1" jdbcDriverRef="myDriver2"/>
<dataSource id="ds1" jdbcDriverRef="myDriver2"/>
- ファクトリー・エレメントは、別のエレメントの下にネストされている場合、実効の同じ親の下の他のエレメントとのみマージされます。以下の例では、id= "ds1" の dataSource エレメントがマージされ、properties.derby.embedded id="props1" エレメントは、親が同じ dataSource id="ds1" である他の properties.derby.embedded id="props1" エレメントとマージされます。
実効構成は以下のようになります。<dataSource id="ds1"> <properties.derby.embedded id="props1" databaseName="myDB"/> </dataSource> <dataSource id="ds2"> <properties.derby.embedded id="props1" user="myUser"/> </dataSource> <dataSource id="ds1"> <properties.derby.embedded id="props1" createDatabase="create"/> </dataSource>
<dataSource id="ds1"> <properties.derby.embedded id="props1" databaseName="myDB" createDatabase="create"/> </dataSource> <dataSource id="ds2"> <properties.derby.embedded id="props1" user="myUser"/> </dataSource>
- ファクトリー・エレメントが別のエレメントの下でネストされていて、そのファクトリー・エレメントに ID 値が指定されていない場合、ネストされているエレメントのカーディナリティーに従って、特殊なルールが適用されます。特定のタイプの複数のネストされているエレメントが期待される場合、エレメントはマージされません。ただし、単一のネストされているエレメントのみが期待される場合、ネストされているエレメントは一緒にマージされます。以下に例を示します。
実効構成は以下のようになります。<topLevel> <multipleNested enabled="true"/> <multipleNested value="1"/> <singleNested enabled="false"/> <singleNested value="2"/> </topLevel>
<topLevel> <multipleNested enabled="true"/> <multipleNested value="1"/> <singleNested enabled="false" value="2"/> </topLevel>
- 2 つのファクトリー・エレメントが別のエレメントの下にネストされていて、ID 値が一致していない場合、マージの動作は、ネストされているエレメントのカーディナリティーによって異なります。複数のネストされているエレメントが期待される場合、エレメントはマージされません。単一のネストされているエレメントが期待される場合、ID 値が競合している場合でも、ネストされているエレメントは一緒にマージされます。以下に例を示します。
実効構成は以下のようになります。<topLevel> <multipleNested id="1" enabled="true"/> <multipleNested id="2" value="1"/> <singleNested id="3" enabled="false"/> <singleNested id="4" value="2"/> </topLevel>
<topLevel> <multipleNested id="1" enabled="true"/> <multipleNested id="2" value="1"/> <singleNested id="4" enabled="false" value="2"/> </topLevel>