我正在使用创建2个REST容器。我想保留一些常见的东西,如JSON提供程序,验证拦截器,使用cxf总线的异常处理。下面是我的申请背景。
<cxf:bus>
<cxf:properties>
<entry key="org.apache.cxf.jaxrs.provider" key-ref="busProviders"/>
</cxf:properties>
</cxf:bus>
<util:list id="busProviders">
<ref bean="requestInterceptor"/>
<ref bean="jsonProvider"/>
<ref bean="exceptionHandler"/>
</util:list>
<bean id="requestInterceptor" class="com.sample.interceptor.ServiceValidationInterceptor"/>
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<bean id="exceptionHandler" class="com.sample.exception.ExceptionHandler" />
<!-- ======================== REST Container for Service1 ======================================= -->
<jaxrs:server id="restContainer" address="/service1">
<jaxrs:serviceBeans>
<ref bean="endecaService"/>
</jaxrs:serviceBeans>
<jaxrs:inInterceptors>
<ref bean="logInbound"/>
<bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpInInterceptor">
<property name="callbackParam" value="callback"/>
</bean>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="logOutbound"/>
<bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPreStreamInterceptor">
<property name="mediaType" value="application/json"/>
</bean>
<bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPostStreamInterceptor">
<property name="paddingEnd" value=")"/>
</bean>
</jaxrs:outInterceptors>
</jaxrs:server>
<!-- ======================== REST Container for Service2========================================== -->
<jaxrs:server id="restContainerForHelpcenter" address="/service2">
<jaxrs:serviceBeans>
<ref bean="helpCenter"/>
</jaxrs:serviceBeans>
<jaxrs:inInterceptors>
<ref bean="logInbound"/>
<bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpInInterceptor">
<property name="callbackParam" value="callback"/>
</bean>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="logOutbound"/>
<bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPreStreamInterceptor">
<property name="mediaType" value="application/json"/>
</bean>
<bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPostStreamInterceptor">
<property name="paddingEnd" value=")"/>
</bean>
</jaxrs:outInterceptors>
</jaxrs:server>
如果我将上面的2组合成一个带有2个服务bean的单个,那么它可以正常工作,但在这种情况下不行。 有没有人使用cxf:bus功能2个不同的REST容器,请告诉我。
答案 0 :(得分:0)
请注意属性名称末尾的s
org.apache.cxf.jaxrs.bus.provider s
答案 1 :(得分:0)
我有一个类似的问题:
我想对JAX-RS服务bean使用自动发现,但是如果我在<jaxrs:providers>
标记内使用<jaxrs:server>
标记但不使用<jaxrs:serviceBeans>
标记,则根本不使用自动发现。
这意味着我还必须对JAX-RS提供程序使用自动发现,这对于位于基本包之下的两个(对于Spring组件扫描)来说并不困难,因为它们已经被注释@Provider
。但是,这对于Jackson来说并不容易(并且不包含在Spring组件扫描中的很多理由,因为它会像
一样多)。程序包包含几个带注释的类)。
因此,我不得不挂断CXF总线上的Jackson提供商。我找到了无用的文档,以及您的帖子,这给了我部分答案。我确实需要多次咒骂,了解xsi:schemaLocation
等所有知识,但是最后,我做到了:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:cxf="http://cxf.apache.org/core" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<context:component-scan base-package="com.example.basepackage"/>
<!-- … -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<jaxrs:server address="/"/>
<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
<cxf:bus>
<cxf:properties>
<entry key="org.apache.cxf.jaxrs.providers" value-ref="busProviders"/>
</cxf:properties>
</cxf:bus>
<util:list id="busProviders">
<ref bean="jsonProvider"/>
</util:list>
</beans>
我删除的代码片段仅包含以下一些手动bean定义:
<bean id="wadlGenerator" class="org.apache.cxf.jaxrs.model.wadl.WadlGenerator">
<property name="linkAnyMediaTypeToXmlSchema" value="true"/>
</bean>
所以我发布的代码段可能足以开始使用。