この質問に答えるために、CXF の知識は必要ありません。
CXF を使用して JAXRS サーバーを作成する次の XML 宣言があるとします。
<jaxrs:server id="customerService" address="/service1">
<jaxrs:serviceBeans>
<ref bean="serviceBean1" />
<ref bean="serviceBean2" />
<ref bean="serviceBean3" />
</jaxrs:serviceBeans>
</jaxrs:server>
ここで、Spring プロファイル メカニズムを使用して、環境ごとにこの JAXRS サーバーをカスタマイズする方法を見つける必要があります。私は次のようなことができます:
<beans profile="dev">
<jaxrs:server id="jaxrsServer" address="/service1">
<jaxrs:serviceBeans>
<ref bean="serviceBean2" />
<ref bean="serviceBean3" />
</jaxrs:serviceBeans>
</jaxrs:server>
</beans>
<beans profile="prod">
<jaxrs:server id="jaxrsServer" address="/service1">
<jaxrs:serviceBeans>
<ref bean="serviceBean1" />
<ref bean="serviceBean2" />
</jaxrs:serviceBeans>
</jaxrs:server>
</beans>
しかし、私の実世界の JAXRS サーバーは私の例よりも少し複雑なので、それは私が望んでいるものではありません。
私が探しているのはそのようなものです:
<jaxrs:server id="jaxrsServer" address="/service1">
<jaxrs:serviceBeans>
<beans profile="dev">
<ref bean="serviceBean1" />
<ref bean="serviceBean2" />
</beans>
<beans profile="dev">
<ref bean="serviceBean2" />
<ref bean="serviceBean3" />
</beans>
</jaxrs:serviceBeans>
</jaxrs:server>
しかし、うまくいきません。
リストの作成を外部化しようとしました:
<bean id="serviceBeansList" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="serviceBean1"/>
<ref bean="serviceBean2"/>
</list>
</constructor-arg>
</bean>
<jaxrs:server id="jaxrsServer" address="/service1">
<jaxrs:serviceBeans>
<ref bean="serviceBeansList" />
</jaxrs:serviceBeans>
</jaxrs:server>
CXF 名前空間ハンドラーはリストを「フラット化」しないため、まだ機能しません。したがって、2 つの serviceBeans オブジェクトのリストを処理する代わりに、CXF によって処理されるタイプではない 1 つの ArrayList のリストを処理します。
Spring XML 解析は、リストを取得しようとします。CXF 名前空間処理コードで次のことがわかりました。
if ( "serviceBeans".equals(name) ) {
List<?> list = ctx.getDelegate().parseListElement(el, bean.getBeanDefinition());
bean.addPropertyValue(name, list);
}
Bean を参照する代わりに、Spring などで「xml 宣言フラグメント」を参照することはできませんか?