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

2022-09-04 00:48:01

使用 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依赖项。


答案 1

在 cxf 3.0.4 中测试和工作。

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

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


答案 2

此代码可以解决问题:

@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 放到你的网页上.xml你就完成了。


推荐