“org.apache.cxf.jaxrs.bus.providers”无法正常工作

时间:2013-12-20 09:55:16

标签: cxf jax-rs bus

我正在使用创建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容器,请告诉我。

2 个答案:

答案 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等所有知识,但是最后,我做到了:

tl; dr

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

所以我发布的代码段可能足以开始使用。