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

时间:2012-11-22 22:29:13

标签: java spring cxf jax-rs

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

我在Spring应用程序中使用CXF,我必须使用以下XML手动声明资源,即使Spring <context:component-scan ...>成功发现了这些资源。

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

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

4 个答案:

答案 0 :(得分:9)

在cxf 3.0.4中测试并使用。

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

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

答案 1 :(得分: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并完成。

答案 2 :(得分:6)

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

答案 3 :(得分:3)

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