在Spring应用程序中使用CXF自动发现JAX-RS资源

Apache CXF(2.7.0)是否可以自动发现类路径中的JAX-RS资源 ? 也就是说,用@Path注释的类。

我在Spring应用程序中使用CXF,我必须使用以下XML手动声明资源,即使Spring 成功发现了资源。

        

我想避免它(因为我可以使用其他JAX-RS实现,例如resteasy)因为在我的情况下它更难维护,并且它迫使我在Spring XML配置文件中声明我的bean依赖项。

在CXF 2.7中,目前看起来没有办法在Spring配置中执行此操作。 如果你看看resteasy,他们已经实现了一个查找@Path和@Provider的BeanFactoryPostProcessor SpringBeanProcessor.java。 类似的东西可能在CXF中完成,但似乎还没有实现。 看起来你并不是唯一对CXF-3725感兴趣的人

这段代码可以解决问题:

 @Configuration @ComponentScan @ImportResource({"classpath:META-INF/cxf/cxf.xml"}) public class Context { @Autowired private ApplicationContext ctx; @Bean public Server jaxRsServer() { LinkedList 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即可。

在cxf 3.0.4中测试并使用。

  

别忘了在web.xml中提到cxf-servlet

除了已经建议的内容:它确实在3.0.0-milestone2中工作,只能执行顶级jaxrs服务器声明并设置basePackages属性,该属性可能有一个或多个空格分隔的包名。