在命名空间内使用Spring配置文件

Seb*_*ber 5 spring cxf jax-rs

您无需知道CXF即可回答此问题.

假设我有以下XML声明,它使用CXF创建JAXRS服务器

  <jaxrs:server id="customerService" address="/service1">
    <jaxrs:serviceBeans>
      <ref bean="serviceBean1" />
      <ref bean="serviceBean2" />
      <ref bean="serviceBean3" />
    </jaxrs:serviceBeans>
  </jaxrs:server>
Run Code Online (Sandbox Code Playgroud)

现在,我需要找到一种方法来使用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>
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的,因为我的真实世界的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>
Run Code Online (Sandbox Code Playgroud)

但它不起作用.


我试图外化我的列表创建:

  <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>
Run Code Online (Sandbox Code Playgroud)

它仍然不起作用,因为CXF命名空间处理程序没有"展平"列表,因此它不处理2个serviceBeans对象的列表,而是处理1个ArrayList的列表,它不是由CXF处理的类型.

Spring XML解析尝试获取列表.我发现在CXF名称空间处理代码中:

if ( "serviceBeans".equals(name) ) {
            List<?> list = ctx.getDelegate().parseListElement(el, bean.getBeanDefinition());
            bean.addPropertyValue(name, list);
}
Run Code Online (Sandbox Code Playgroud)

而不是引用bean,是不是可以引用一个"xml声明片段"与Spring或其他可能有效的东西?

Bor*_*hov 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>
Run Code Online (Sandbox Code Playgroud)

免责声明:这个答案纯粹是幻想,但评论有些有限 - 如果它不起作用,我会删除