14

Apache CXF (2.7.0)でクラスパス内の JAX-RS リソースを自動的に検出することは可能ですか? つまり、 で注釈が付けられたクラス@Pathです。

Spring アプリケーションで CXF を使用しており、リソースが Spring によって正常に検出された場合でも、次の XML を使用してリソースを手動で宣言する必要があります<context:component-scan ...>

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

私の場合、維持するのが難しく、Spring XML 構成ファイルで Bean 依存関係を宣言する必要があるため、(resteasy などの他の JAX-RS 実装でできるように) 回避したいと思います。

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 に答える