2012-11-22 42 views
11

Apache CXF(2.7.0)至可以在類路徑中自動發現JAX-RS資源嗎?也就是說,用@Path註解的類。在Spring應用程序中使用CXF自動發現JAX-RS資源

我在Spring應用程序中使用CXF,即使資源被Spring <context:component-scan ...>成功發現,我也必須使用以下XML手動聲明資源。

<jaxrs:server id="myService" address="/myService"> 
    <jaxrs:serviceBeans> 
     <ref bean="myResource1" /> 
     <ref bean="myResource2" /> 
     <ref bean="myResource3" /> 
    </jaxrs:serviceBeans> 
</jaxrs:server> 

我想避免它,因爲在我的情況下,難以維持(我可以與其他JAX-RS實現,比如RestEasy的那樣),而且它迫使我在春天宣佈我的豆依賴XML配置文件。

+0

FWIW,我發現它非常有用顯式聲明的東西。但是在同一個應用程序中有多個''聲明,每個都有不同的配置(例如不同的XML序列化器)。 RESTeasy方法並不靈活... –

回答

6

看起來在CXF 2.7中看起來沒有辦法在Spring配置中執行此操作。如果你看到resteasy他們已經實現了一個BeanFactoryPostProcessor SpringBeanProcessor.java,它尋找@Path和@Provider。類似的事情可能可以在CXF中完成,但似乎尚未實現。看起來你不是唯一一個有興趣的CXF-3725

8

此代碼的伎倆:

@Configuration 
@ComponentScan 
@ImportResource({"classpath:META-INF/cxf/cxf.xml"}) 
public class Context { 
    @Autowired 
    private ApplicationContext ctx; 

    @Bean 
    public Server jaxRsServer() { 
     LinkedList<ResourceProvider> resourceProviders = new LinkedList<>(); 
     for (String beanName : ctx.getBeanDefinitionNames()) { 
      if (ctx.findAnnotationOnBean(beanName, Path.class) != null) { 
       SpringResourceFactory factory = new SpringResourceFactory(beanName); 
       factory.setApplicationContext(ctx); 
       resourceProviders.add(factory); 
      } 
     } 

     JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean(); 
     factory.setBus(ctx.getBean(SpringBus.class)); 
     factory.setProviders(Arrays.asList(new JacksonJsonProvider())); 
     factory.setResourceProviders(resourceProviders); 
     return factory.create(); 
    } 
} 

只記得把CXFServlet到你的web.xml和你做。

+0

有沒有人找到一個春天的自動配置呢?就像,我甚至不需要提供一個bean? –

2

除了已經提出的建議:它的確可以在3.0.0-milestone2中運行,只需要執行頂級jaxrs服務器聲明並設置basePackages屬性,該屬性可能具有一個或多個空間分隔的包名稱。

7

測試並在cxf 3.0.4中工作。

<jaxrs:server address="/" basePackages="a.b.c"/> 

不要忘記提及CXF-的servlet在web.xml中

+0

我如何使用彈簧啓動進行此操作?我發現了一個較新的類/代碼,但我遇到了一些其他問題: JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean bean = new JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean(); bean.setBasePackages(Collections.singletonList(SimulationController.class.getPackage()。getName())); return bean.create(); –

+0

@ChristianBongiorno這裏是cxf文檔的鏈接。 Spring Boot安裝有很好的描述。 http://cxf.apache.org/docs/jaxrs-services-configuration.html#JAXRSServicesConfiguration-SpringBoot –

+0

@AlexAmorales我已經在那裏。這些示例不起作用。該配置bean只會導入xml。我希望它將每個Path Bean添加到服務中。 –

相關問題