你不需要知道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对象的列表,而是处理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声明片段”?
You don't need to know CXF to answer this question.
Suppose I have the following XML declaration which creates a JAXRS server using CXF
<jaxrs:server id="customerService" address="/service1"> <jaxrs:serviceBeans> <ref bean="serviceBean1" /> <ref bean="serviceBean2" /> <ref bean="serviceBean3" /> </jaxrs:serviceBeans> </jaxrs:server>Now I need to find a way to customize this JAXRS server per environment, using Spring profiles mechanism. I could do something like:
<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>But it is not what I would like to have, because my real-world JAXRS server is a bit more complicated than in my exemple.
What I am looking for is something like that:
<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>But it doesn't work.
I tried to externalize my list creation:
<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>It still doesn't work because CXF namespace handler does not "flatten" the list, so instead of dealing with a list of 2 serviceBeans objects, it deals with a list of 1 ArrayList, which is not a type handled by CXF.
The Spring XML parsing tries to get a list. I found that in CXF namespace handling code:
if ( "serviceBeans".equals(name) ) { List<?> list = ctx.getDelegate().parseListElement(el, bean.getBeanDefinition()); bean.addPropertyValue(name, list); }Instead of referencing a bean, isn't it possible to reference a "xml declaration fragment" with Spring or something else that could work?
最满意答案
你有没有尝试过使用别名+配置文件
<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>免责声明:这个答案是一个纯粹的幻想,但评论是有限的 - 我会删除,如果它不会工作
Have you tried using aliases + profiles
<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>disclaimer: this answer is a pure fantasy, but the comments are somewhat limited - I'll remove if it won't work
更多推荐
CXF,Spring,list,电脑培训,计算机培训,IT培训"/> <meta name="description&q
发布评论