5

この質問に答えるために、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 宣言フラグメント」を参照することはできませんか?

4

1 に答える 1

1

エイリアスとプロファイルを使用してみましたか

<jaxrs:server id="jaxrsServer" address="/service1">
  <jaxrs:serviceBeans>
    <ref bean="serviceBeanA" />
    <ref bean="serviceBeanB" />
  </jaxrs:serviceBeans>
</jaxrs:server>

<beans profile="profile1">
  <alias name="serviceBean1" alias="serviceBeanA"/>
  <alias name="serviceBean2" alias="serviceBeanB" />
</beans>
<beans profile="profile2">
  <alias name="serviceBean3" alias="serviceBeanA"/>
  <alias name="serviceBean4" alias="serviceBeanB" />
</beans>

免責事項:この回答は純粋な空想ですが、コメントは多少制限されています-うまくいかない場合は削除します

于 2012-11-13T08:34:49.573 に答える