Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring应用程序中使用CXF自动发现JAX-RS资源_Java_Spring_Cxf_Jax Rs - Fatal编程技术网

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

Java 在Spring应用程序中使用CXF自动发现JAX-RS资源,java,spring,cxf,jax-rs,Java,Spring,Cxf,Jax Rs,ApacheCXF(2.7.0)是否有可能自动发现类路径中的JAX-RS资源?也就是说,用@Path注释的类 我在Spring应用程序中使用CXF,我必须用以下XML手动声明资源,即使Spring成功地发现了这些资源 我希望避免这种情况(我可以使用其他JAX-RS实现,如resteasy),因为在我的情况下,它更难维护,而且它迫使我在SpringXML配置文件中声明我的bean依赖项。在CXF2.7中,此时似乎没有办法使用Spring配置来实现这一点。如果你看看resteasy,他们已经实现

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

我在Spring应用程序中使用CXF,我必须用以下XML手动声明资源,即使Spring成功地发现了这些资源



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

在CXF2.7中,此时似乎没有办法使用Spring配置来实现这一点。如果你看看resteasy,他们已经实现了一个BeanFactoryPostProcessor SpringBeanProcessor.java,它查找@Path和@Provider。在CXF中可能也可以做类似的事情,但似乎还没有实现。看起来你不是唯一感兴趣的人

这段代码起到了关键作用:

@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();
    }
}
@配置
@组件扫描
@ImportResource({“classpath:META-INF/cxf/cxf.xml})
公共类上下文{
@自动连线
私有应用上下文ctx;
@豆子
公共服务器jaxRsServer(){
LinkedList resourceProviders=新建LinkedList();
for(字符串beanName:ctx.getBeanDefinitionNames()){
if(ctx.findAnnotationOnBean(beanName,Path.class)!=null){
SpringResourceFactory工厂=新的SpringResourceFactory(beanName);
工厂.setApplicationContext(ctx);
resourceProviders.add(工厂);
}
}
JAXRSServerFactoryBean工厂=新的JAXRSServerFactoryBean();
setBus(ctx.getBean(SpringBus.class));
setProviders(Arrays.asList(新的JacksonJsonProvider());
setResourceProviders(resourceProviders);
返回factory.create();
}
}

只要记住将CXFServlet放入web.xml中,您就完成了。

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

在cxf 3.0.4中测试和工作

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


别忘了在web.xml中提到cxfservlet,我发现显式声明东西非常有用。但是,我在同一个应用程序中有多个
声明,每个声明都有不同的配置(例如,不同的XML序列化程序)。RESTeasy方法没有那么灵活…我如何使用spring boot实现这一点?我发现了一个较新的类/代码,但还有一些其他问题:jaxrserverfactorybeandefinitionparser.springjaxrserverfactorybean=new jaxrserverfactorybeandefinitionparser.springjaxrserverfactorybean();setBasePackages(Collections.singletonList(SimulationController.class.getPackage().getName());返回bean.create()@ChristianBongiorno这里是指向cxf文档的链接。对Spring引导设置有很好的描述@亚历山大·莫拉莱斯,我已经在那里了。这些例子不起作用。该配置bean除了导入xml之外什么也不做。我希望它将每个路径bean添加到服务中。感谢您的解释。这与@SergeyBeryozkin的答案相同,但更详细不过,这比这要复杂一些,尤其是当您需要Jackson作为JSON提供者时。有人在这上面找到spring的自动配置吗?比如,我甚至不需要提供豆子?
<jaxrs:server address="/" basePackages="a.b.c"/>