你不需要知道 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>
现在我需要找到一种方法来为每个环境定制这个 JAXRS 服务器,使用 Spring 配置文件机制。我可以做类似的事情:
<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 声明片段”吗?