spring Boot和CXF构建WebService

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring Boot和CXF构建WebService相关的知识,希望对你有一定的参考价值。

参考技术A 说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例如银行、航空公司的机票查询接口等。

目前就遇到了这种情况,需要在系统中查询第三方提供的soap web service接口,也就是说要将它整合进现有的系统当中。

Spring整合CXF本来十分简单,但是因为使用了 Spring Boot ,不想用以前xml一堆配置的方式,那么能否按照Spring Boot的风格优雅的进行整合呢?

答案当然是肯定的,但是遍查网上几乎没有这方面的资料,折腾过后觉得还是有必要记录一下,虽然它显得非常的简单。

这里主要添加的是cxf的包依赖

这里我创建了一个hello word的测试方法

在业务实现中我们需要如下配置:
参数说明:
targetNamespace 为这是我的接口类所在路径;
endpointInterface 这是我的业务类所在路径;

业务层我们已经创建完成了,但是我们应该如何让webService运行起来呢?

那么到这里呢,我们的所有的步骤基本完成了,启动spring boot 然后再浏览器中输入url: http://localhost:8080/webService/user?wsdl
可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。
那么这里我又要增加注释了,请大家注意,我在最初查询资料,配置demo的时候,启动以后,发布时候总是报404,网上有很多关于什么端口冲突等说法,我试过后,根本不是那一回事,然后我无意中尝试了一下,在url地址处加入工程名,结果,问题解决了。
因此请大家注意:在测试发布服务的时候,你在浏览器中输入的url地址应该是: http://localhost:8080/ 你的工程名/user?wsdl

注:如果大家在搭建过程中遇到了注册CXFServlet的时候,一直报错,则可检查是否添加了 autoconfigure 的配置

启动服务之后,在浏览器上输入 http://localhost:8080/webService/user?wsdl 如果出现如下界面,则代表发布成功了!

服务端我们已经写好了,那么客户端如何弄呢?其实我们可以借助Idea自己生成WebServiceClient,步骤如下:

打开新建一个项目,选择WebServiceClient

输入webService服务端的地址

点击Ok即可生成WebService的客户端

通过如下方法即可调用方法,是不是很简单!

本文使用的是Apache CXF集成,因为spring boot存在的目的就是一个微服务框架,结果又搞个soap框架进去,显得特别不伦不类。正是因为有这么多老项目的重构才会有这么不伦不类的集成。综上,我就选了spring家族的spring web service能够很好的跟spring boot进行集成。

那么我会在下面的一篇文章中为大家说明如何使用spring web service!

码云: https://gitee.com/hrabbit/spring-boot-node
个人博客: www.hrabbit.xin

用于 RESTful Web 服务的 Spring Boot 与 Apache CXF?

【中文标题】用于 RESTful Web 服务的 Spring Boot 与 Apache CXF?【英文标题】:Spring Boot vs. Apache CXF for RESTful Web Services? 【发布时间】:2014-09-24 19:45:37 【问题描述】:

我是编码竞赛的一员,任务是创建一个 RESTful 在线市场,用户可以在其中通过 http 发布买卖请求。

我需要构建一个接受并存储这些请求的前端 Web 服务。

技术要求包括 Spring Boot 和 CXF。据我所知,CXF 和 Spring boot 都能够接受 http 请求。

在 Spring Boot 中,您使用如下控制器:

@Controller
@EnableAutoConfiguration
public class controller 

    @RequestMapping("/")
    @ResponseBody
    String home() 
        return "Hello, World!";
    

而对于 CXF(使用 javax.ws.rs),代码可能如下所示:

@WebService(serviceName = "MarketService", targetNamespace = "http://localhost:9005")
@Consumes( MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON )
public interface MarketService 

    @GET
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces( MediaType.APPLICATION_JSON )
    @Path("/sells/id")
    public prod getProduct(@PathParam("id") int id);

有人可以帮我理解这两种处理 http 请求的方法之间的根本区别吗?有没有办法在同一个应用程序中同时使用 Spring Boot 和 CXF?

【问题讨论】:

spring 示例真的不是 spring boot……它看起来更像 spring-mvc。您可能正在使用 spring-boot 来启动并运行您的应用程序......但您使用的代码是 spring-mvc 的东西。 【参考方案1】:

通过添加以下内容来使用 Spring Boot CXF JAX-RS 启动器:

<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
  <version>3.1.7</version>
</dependency>

另请参阅:http://cxf.apache.org/docs/springboot.html

【讨论】:

【参考方案2】:

Spring MVC 和 Apache CXF 是处理 HTTP 请求的 2 个独立框架,可用于构建 REST Web 服务。

Spring MVC 是 Spring“保护伞”下的一个项目(因此与构建它的 Spring 框架紧密相关), Apache CXF 是 JAX-RS (REST) 和 JAX-WS (SOAP) 的开源实现。 Apache CXF 可以独立运行,也可以包含在 Spring 应用程序中。

如果您希望构建 REST Web 服务,它们几乎是互斥的(您必须选择一个)。如果您要做的只是构建 REST Web 服务,那么它们几乎是等价的。如果您还需要一个 MVC 框架来服务 HTML 页面,那么 Spring MVC 具有该功能(CXF 没有)。

个人意见:Spring MVC 比 CXF(需要更多 XML 配置)更容易上手(感谢 Spring Boot 为您处理大部分配置)。

PS:在您的 CXF 示例中,您有一个 @WebService 注释。此注释是 JAX-WS (SOAP) 的一部分,而不是 JAX-RS (REST)。你可能不需要它。

【讨论】:

这里的通知中的一点评论;使用 REST WS 然后 REST Web 服务真的让我感到困惑,认为这些肯定是不同的东西(也许它们是??)。可能需要稍作修改以使其更清晰。【参考方案3】:

查看此项目,了解如何通过 TomEE 在 Tomcat 上利用 CXF 的 JAX-RS (REST) 入门。

一切都已准备就绪。

https://github.com/tomitribe/tomee-jaxrs-starter-project

详细说明:

http://www.tomitribe.com/blog/2014/06/apache-tomee-jax-rs-and-arquillian-starter-project

注意,运行 CXF "Standalone" 仍然需要一个 Servlet 容器(Tomcat 或 Jetty),所以以上是在一个小型启动项目中完成、简化和完成的几个步骤。专为不喜欢看方向而只想开始黑客攻击的不耐烦的人(比如我自己)设计。我总是更容易从可行的东西开始,然后对其进行调整。

【讨论】:

以上是关于spring Boot和CXF构建WebService的主要内容,如果未能解决你的问题,请参考以下文章

带有tomcat和cxf-servlet的spring-boot

spring boot整合cxf发布和调用webservice

使用 CXF 生成 SOAP 1.2 端点的 Java Spring Boot

无法在 Spring Boot 应用程序之上使用 CXF 运行 swagger

Error creating bean with name 'org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration

Error creating bean with name 'org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration(示例代