【问题标题】:Autodiscover JAX-RS resources with CXF in a Spring application在 Spring 应用程序中使用 CXF 自动发现 JAX-RS 资源
【发布时间】:2012-11-11 07:56:35
【问题描述】:

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

【问题讨论】:

  • FWIW,我发现明确声明事物非常有用。但后来我在同一个应用程序中有多个 &lt;jaxrs:server&gt; 声明,每个声明都有不同的配置(例如,不同的 XML 序列化程序)。 RESTeasy 方法没有那么灵活……

标签: java spring cxf jax-rs


【解决方案1】:

在 cxf 3.0.4 中测试和工作。

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

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

【讨论】:

  • 如何使用弹簧靴做到这一点?我找到了一个更新的类/代码,但我遇到了一些其他问题: JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean bean = new JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean(); bean.setBasePackages(Collections.singletonList(SimulationController.class.getPackage().getName()));返回 bean.create();
  • @ChristianBongiorno 这是 cxf 文档的链接。 Spring Boot 设置有很好的描述。 cxf.apache.org/docs/…
  • @AlexAmorales 我已经在那里了。这些例子不起作用。该配置 bean 除了导入 xml 什么都不做。我希望它将每个 Path bean 添加到服务中。
  • 感谢您的解释。这与来自@SergeyBeryozkin 的the one-year-older one 的答案相同,但更详细。 • 不过,这比这要复杂一些,尤其是当您需要 Jackson 作为 JSON 提供者时。我eventually figured this out.
【解决方案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 放到你的 web.xml 中就可以了。

【讨论】:

  • 有人在这上面找到了 spring 的自动配置吗?比如,我什至不需要提供豆子?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2014-04-15
      相关资源
      最近更新 更多