Java 在Spring应用程序中使用CXF自动发现JAX-RS资源
ApacheCXF(2.7.0)是否有可能自动发现类路径中的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,他们已经实现
@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"/>