在命名空间内使用Spring配置文件(Using Spring profiles inside a namespace)

编程入门 行业动态 更新时间:2024-10-25 00:35:56
在命名空间内使用Spring配置文件(Using Spring profiles inside a namespace)

你不需要知道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

本文发布于:2023-07-24 19:34:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1250171.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:配置文件   空间   namespace   Spring   profiles

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!