14

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

4 回答 4

9

在 cxf 3.0.4 中测试和工作。

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

不要忘记在 web.xml 中提及 cxf-servlet

于 2015-03-17T02:55:34.697 回答
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 中即可。

于 2013-10-19T18:49:38.977 回答
6

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

于 2012-12-05T22:21:02.480 回答
3

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

于 2014-04-11T13:25:03.373 回答