Descoberta automática de resources JAX-RS com o CXF em um aplicativo Spring

É possível com o Apache CXF (2.7.0) descobrir automaticamente resources JAX-RS no caminho de class ? Isto é, classs anotadas com @Path .

Estou usando o CXF em um aplicativo Spring e tenho que declarar manualmente os resources com o seguinte XML, mesmo se os resources forem descobertos com êxito pelo Spring .

        

Eu gostaria de evitá-lo (como posso fazer com outras implementações do JAX-RS, como resteasy) porque no meu caso é mais difícil de manter, e me obriga a declarar minhas dependencies de bean no arquivo de configuração XML do Spring.

Não parece que há uma maneira de fazer isso com a configuração Spring neste momento no CXF 2.7. Se você olhar para resteasy eles implementaram um BeanFactoryPostProcessor SpringBeanProcessor.java que procura por @Path e @Provider. Algo semelhante poderia provavelmente ser feito no CXF, mas não parece ser implementado ainda. Parece que você não é o único interessado CXF-3725

Este código faz o truque:

 @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(); } } 

Lembre-se de colocar o CXFServlet no seu web.xml e pronto.

Testado e trabalhando em cxf 3.0.4.

  

Não se esqueça de mencionar o cxf-servlet no web.xml

Além do que foi sugerido: funciona de fato em 3.0.0-milestone2, apenas seria feita uma declaração do servidor jaxrs de nível superior e o atributo basePackages, que pode ter um ou mais nomes de pacotes separados por espaço.