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

标签 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>

现在我需要找到一种方法来使用 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 对象的列表,而是处理 1 个 ArrayList 的列表,这不是 CXF 处理的类型。

Spring XML 解析尝试获取列表。我发现在 CXF 命名空间处理代码中:
if ( "serviceBeans".equals(name) ) {
            List<?> list = ctx.getDelegate().parseListElement(el, bean.getBeanDefinition());
            bean.addPropertyValue(name, list);
}

除了引用 bean,是否可以使用 Spring 或其他可行的方法引用“xml 声明片段”?

最佳答案

您是否尝试过使用别名 + 配置文件

<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>

免责声明:此答案纯属幻想,但评论有些有限-如果不起作用,我将删除

关于spring - 在命名空间内使用 Spring 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344564/

相关文章:

java - 将 Spring Rest Controller 映射到没有 Servlet 上下文的路径

java - 我在哪里可以在 Spring 3.1 中指定 Jackson SerializationConfig.Feature 设置

Java RESTful文件上传问题

java - 使用客户端时在 Apache CXF 上禁用 FastInfoset(强制 XML)

java - 接受 header 为空或未知时的内容类型

java - JAX-RS:是否可以有一个外部可配置的@PATH?

java - 部署期间无法使用 weblogic12 中的 spring 模式文档读取 spring beans xml

java - 替换 java.lang.Object 绑定(bind)到匿名类型

java - Apache CXF 和 Spring MVC

javax.ws.rs.ProcessingException : RESTEASY004655: Unable to invoke request