cxf 服务端soap报文

在上一篇文章中,我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤。 在本文中,我将讨论使用CXF开发SOAP Web服务。 在继续前进之前,让我们先了解一下构成SOAP Web服务的概念/元素

SOAP或简单对象访问协议

SOAP是一种协议,用于使用诸如http,smtp等应用程序协议作为载体在网络上交换基于XML的消息。 SOAP消息包含一个SOAP信封。 信封可以分为标题和正文。 标头包含与上下文相关的定义(例如安全性),而主体包含实际的应用程序数据。 典型的SOAP消息看起来像

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"><soap:Header></soap:Header><soap:Body><m:GetStockPrice xmlns:m="http://www.example.org/stock"><m:StockName>IBM</m:StockName></m:GetStockPrice></soap:Body>
</soap:Envelope>

WSDL或Web服务描述语言

WSDL是基于标准的XML语言,用于描述Web服务。 WSDL完整描述了Web服务公开的公共接口,期望的参数,返回的输出结构,Web服务的位置。 WSDL将Web服务定义为能够交换消息的通信端点的集合。 这些通信端点称为端口。 端口由两部分组成。

  1. 包含Web服务公开的公共接口。 该接口包含所有方法,调用它们所需的参数以及它们返回的响应结构。
  2. 第二部分将公共接口绑定到诸如http之类的网络协议。 绑定包括诸如公共接口的位置和服务的消息格式之类的信息。

SOAP通讯样式

存在两种类型的沟通方式

  1. 文件
  2. RPC

SOAP Web服务使用的通信样式在其WSDL中定义。

在文档样式中,作为肥皂主体一部分的应用程序数据作为XML文档发送。 可以通过也是WSDL一部分的xml模式完全验证该文档。 由于XML可以按照服务开发人员的意愿包含结构,因此,对XML有效负载进行编组和解组的责任在于提供者和使用者代码的末尾。

顾名思义,以RPC风格表示,使用者调用服务方法就像调用本地方法一样。 为此,RPC消息由使用者可以调用的公共接口方法列表组成。 这些方法按名称列为xml元素。 这些方法所需的方法参数构成方法元素的子元素。 封送/取消封送的责任在于Web服务框架。 该框架包含其自己的封送/解封库。 RPC样式导致应用程序代码和Web服务框架之间的代码紧密耦合,因此规范是创建文档样式服务。 掌握了关键概念之后,让我们看一下如何使用Apache CXF编写肥皂网络服务的示例。

获取本教程的源代码

我已经在SVN中提交了本教程的源文件。

  • 您可以从以下网站下载该Web应用程序: http : //subversion.assembla.com/svn/weblog4j/Weblog4jDemo/trunk
  • 您可以从以下 网址 下载客户端: http : //subversion.assembla.com/svn/weblog4j/DemoClient/trunk

注意:这两个都是ItelliJ maven项目,因此您可以将它们直接导入到intelliJ IDE或手动将文件复制到其他IDE

创建一个struts2框架应用程序以包含您的服务。

您可以使用任何MVC框架,但出于自己的原因,我更喜欢struts2。 您可以在此处看到有关如何使用Eclipse在eclipse中创建空的struts2应用程序的示例。

添加CXF依赖项

在您的项目POM中添加以下依赖项以下载CXF jar

<properties><cxf.version>2.5.0</cxf.version>
</properties>
<dependencies><!-- apache cxf --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxrs</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>${cxf.version}</version></dependency>
</dependencies>

例如,让我们创建一个简单的书架网络服务。 为简单起见,让我们假设以下用例。

  1. 在自己的书中插入一本书
  2. 从书架上按标题检索一本书。

开发服务

可以通过两种方式完成:“代码优先”和“合同优先”。 我们将使用代码优先方法。

创建服务端点接口(SEI)

让我们创建一个名为BookShelfService的SEI接口

package com.aranin.weblog4j.services;import com.aranin.weblog4j.vo.BookVO;import javax.jws.WebMethod;
import javax.jws.WebService;@WebService
public interface BookShelfService {@WebMethodpublic  String insertBook(BookVO bookVO);@WebMethodpublic  BookVO getBook(String title);
}

如果看上面的SEI,可以看出它是一个普通的Java接口,但有两个注释

  • @WebService –这是一个注释JAXWS库。 它将普通的POJO转换为Web服务。 在我们的例子中,注释位于接口定义的正上方,它通知BookShelfService不是普通接口,而是Web服务接口或SEI。 该注释还有其他一些属性可以完全定义Web服务,但是我们现在不会使用它。
  • @WebMethod –此注释是可选的,主要用于为wsdl中的公共方法提供名称属性。

实施服务。

现在我们有了SEI,因此让我们在BookShelfServiceImpl的接口中实现方法

package com.aranin.weblog4j.services;import com.aranin.weblog4j.hashdb.HashDB;
import com.aranin.weblog4j.vo.BookVO;import javax.jws.WebService;@WebService(endpointInterface = "com.aranin.weblog4j.services.BookShelfService",serviceName="bookShelfService")
public class BookShelfServiceImpl implements BookShelfService {public String insertBook(BookVO bookVO) {HashDB.insertBook(bookVO);return "Book with name : " + bookVO.getBookName() + " is now available on the shelf";  //To change body of implemented methods use File | Settings | File Templates.}public BookVO getBook(String title) {return HashDB.getBook(title);  //To change body of implemented methods use File | Settings | File Templates.}
}

此类是实现SEI的简单POJO。 这里唯一值得注意的是@WebService批注。 如果您仔细看一下,我们提供了它实现的SEI的完全合格的类名和Web服务的名称。

数据绑定类(BookVO)

package com.aranin.weblog4j.vo;import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;@XmlRootElement(name = "Book")
public class BookVO implements Serializable {private long bookId;private String bookName;private String author;public long getBookId() {return bookId;}public void setBookId(long bucketId) {this.bookId = bookId;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}
}

这里唯一要注意的是@XmlRootElement批注。 该注释是JAXB库的一部分。 CXF使用JAXB作为默认数据绑定组件。 由于BookVO需要在Web服务调用期间作为XML进行传输,因此需要在CXF安装中由JAXB引擎进行编组/解组。 使用@XmlRootElement批注,我们可以帮助JAXB将BookVO类映射到一个XML,该XML的name属性作为xml的根元素。

基于Spring的服务器Bean

使CXF成为Web服务框架的第一选择的原因是它通过基于Spring的配置文件发布其服务端点。 让我们创建一个配置文件并在其中注册我们的服务。 我们将文件命名为beans.xml并将其保存在应用程序的WEB-INF文件夹中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />   <jaxws:endpointid="bookShelfService"implementor="com.aranin.weblog4j.services.BookShelfServiceImpl"address="/bookshelfservice" /></beans>

现在要加载beans.xml,我们只需在web.xml中添加以下内容

<context-param>
<param-name>contextConfigLocation</param-name><param-value>/WEB-INF/beans.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>

最后,我们需要通过web.xml连接spring和CXF。

<servlet><servlet-name>CXFServlet</servlet-name><display-name>CXF Servlet</display-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><load-on-startup>2</load-on-startup>
</servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/*</url-pattern>
</servlet-mapping>

注意:我没有包括Spring ContextLoaderListner的加载。 如果您使用struts2入门原型通过maven创建了struts2应用程序,那么spring将由maven项目本身下载并注册。

现在您的Web服务已准备就绪。 在任何servlet容器中编译和部署应用程序。 如果一切都很好,那么您可以在以下位置看到您的wsld: http:// localhost:8080 / weblog4jdemo / bookshelfservice?wsdl

创建您的客户

有许多工具可用于使用wsdl生成客户端代码。 为了节省您的麻烦,我们将利用CXF自己的前端api。 因此,让我们看一下步骤。

  1. 使用您选择的IDE创建一个简单的Maven项目。 我目前正在使用IntelliJ,它很棒。 可以说该项目的名称为DemoClient。
  2. 如创建框架应用程序部分所示,添加CXF依赖项。
  3. 既然我们知道了SEI和公共方法以及绑定对象是什么。 我们将在客户端创建它们,以免给我们带来麻烦。 如果有很多这样的类,我们可以使用诸如wsdl2java之类的工具来生成我们的代码。
  4. 以与父SEI完全相同的包结构创建存根SEI。
  5. 以与父BookVO相同的包结构创建BookVO。
  6. 以上类应与您在父应用程序中创建的类完全相同。
  7. 我们不需要在客户端创建SEI实现。
  8. 现在,我们将使用JaxWsProxyFactoryBean创建一个客户端。 此类是与SEI代理一起使用以调用Web服务方法的工厂。 这是课程。
package com.aranin.weblog4j.client;import com.aranin.weblog4j.services.BookShelfService;
import com.aranin.weblog4j.vo.BookVO;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;public class DemoClient {public static void main(String[] args){String serviceUrl = "http://localhost:8080/weblog4jdemo/bookshelfservice";JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();factory.setServiceClass(BookShelfService.class);factory.setAddress(serviceUrl);BookShelfService bookService = (BookShelfService) factory.create();//insert bookBookVO bookVO = new BookVO();bookVO.setAuthor("Issac Asimov");bookVO.setBookName("Foundation and Earth");String result = bookService.insertBook(bookVO);System.out.println("result : " + result);bookVO = new BookVO();bookVO.setAuthor("Issac Asimov");bookVO.setBookName("Foundation and Empire");result = bookService.insertBook(bookVO);System.out.println("result : " + result);bookVO = new BookVO();bookVO.setAuthor("Arthur C Clarke");bookVO.setBookName("Rama Revealed");result = bookService.insertBook(bookVO);System.out.println("result : " + result);//retrieve bookbookVO = bookService.getBook("Foundation and Earth");System.out.println("book name : " + bookVO.getBookName());System.out.println("book author : " + bookVO.getAuthor());}
}

这是上述调用的输出

INFO: Creating Service {http://services.weblog4j.aranin.com/}BookShelfServiceService from class com.aranin.weblog4j.services.BookShelfService
result : Book with name : Foundation and Earth is now available on the shelf
result : Book with name : Foundation and Empire is now available on the shelf
result : Book with name : Rama Revealed is now available on the shelf
book name : Foundation and Earth
book author : Issac AsimovProcess finished with exit code 0

您可以在Apache CXF中探索大量其他内容,例如创建动态客户端,拦截器,利用其他传输协议,基于https的Web服务等。但是,我打算将本文作为入门教程。

ew,这又是一个漫长的帖子。 我需要提高写作技巧以缩短篇幅。 但我仍然希望您喜欢它并发现它有用。 我打算在我的下一篇文章中介绍有关Web服务的javascript客户端。 在那之前,再见,快乐的编码。

参考: Weblog4j博客上的JCG合作伙伴 Niraj Singh 使用Apache CXF开发SOAP Web服务 。

翻译自: https://www.javacodegeeks.com/2013/06/developing-soap-web-service-using-apache-cxf.html

cxf 服务端soap报文

cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务相关推荐

  1. java axis2 开发_基于Apache axis2开发Java Web服务

    1.安装配置axis2环境 下载好后把axis2-1.4.1-war目录下面的axis2.war发布到tomcat的webapps中. 发布好,访问:http://localhost:8079/axi ...

  2. JAVA 开发axis2_基于Apache axis2开发Java Web服务

    1.安装配置axis2环境 下载好后把axis2-1.4.1-war目录下面的axis2.war发布到tomcat的webapps中. 发布好,访问:http://localhost:8079/axi ...

  3. 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

    http://www.ibm.com/developerworks/cn/web/wa-aj-tomcat/ 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务 Y ...

  4. jersey tomcat MySQL_基于jersey和Apache Tomcat构建Restful Web服务(一)

    基于jersey和Apache Tomcat构建Restful Web服务(一) 现如今,RESTful架构已然成为了最流行的一种互联网软件架构,它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...

  5. java soap axis,使用SOAP开发java web服务 Axis开发方案

    使用SOAP开发java web服务 Axis开发方案 本文的预定读者首先要对j2ee有所了解,熟悉xml,tomcat等基本内容,本文主要是简单介绍一下web服务的基本内容,怎样在java web开 ...

  6. 使用Spring MVC开发Restful Web服务

    REST简介 摘自Wikipedia: REST风格的体系结构由客户端和服务器组成. 客户端向服务器发起请求: 服务器处理请求并返回适当的响应. 请求和响应围绕资源表示的传递而构建. 资源本质上可以是 ...

  7. apache-cxf 使用_使用Apache CXF进行Web服务学习

    apache-cxf 使用 在我的最后几个项目中,我使用了Web服务,在某些地方创建它们并在其他地方使用它们. 我认为标准任务(例如创建客户端,创建Web服务等)非常简单,如果遇到问题,有足够的资源. ...

  8. 限制会话id服务端不共享_会话控制 - able-woman - 博客园

    会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段.而会话,就是用户通过浏览器和服务器的一次通话. 为什么要有会话控制? 因为HTTP协议是无状态的,服务器不知道用户上一次做 ...

  9. 限制会话id服务端不共享_不懂 Zookeeper?看完不懂你打我

    高并发分布式开发技术体系已然非常的庞大,从国内互联网企业使用情况,可发现RPC.Dubbo.ZK是最基础的技能要求.关于Zookeeper你是不是还停留在Dubbo注册中心的印象中呢?还有它的工作原理 ...

最新文章

  1. R语言大会:宏基因组数据分析和可视化套路总结
  2. ASP.NET 实践:写入 Cookie
  3. JS三种消息框的使用
  4. OpenCV 开闭运算
  5. JZOJ 5930. 【NOIP2018模拟10.26】山花
  6. Java的重载与覆盖,傻傻分不清!
  7. 基于java二手书论文_java毕业设计_springboot框架的二手书交易管理与实现
  8. (计算机组成原理)第五章中央处理器-第一节:CPU的功能与基本结构(运算器和控制器等寄存器)
  9. vb6.0企业版win7_比win7更快?官方精简win10:3G+不更新,旧电脑福音
  10. 4+64GB版的4G手机定价1699?网友:多了个1吧...
  11. 【原创】轻量级移动端即时通讯技术 MobileIMSDK 发布了
  12. python毕业设计作品基于django框架的鲜花水果商城毕设成品(6)开题答辩PPT
  13. 瑞萨RH850F1L用户手册(UM)CAN接口部分中文翻译(Section 19 CAN Interface (RS-CAN))
  14. 安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染
  15. 商品SPU与SKU说明
  16. 构造函数可以是虚函数吗?不看看你就亏大了
  17. 记录一次自己刷bios
  18. 用自己的域名创建邮箱( 苹果用户订阅 icloud + 服务)
  19. 计算机科目的一千字,计算机心得体会1000字_1000字美文摘抄_1000字左右的
  20. 【Excel_006】利用数据验证创建二级关联下拉菜单

热门文章

  1. MongoDB新建或删除索引
  2. Dubbo(三)之Spring zookeeper集成
  3. 汇编语言(四)之比较字符串
  4. 机器学习中向量化编程总结记录
  5. sleep( ) 和 wait( ) 的这 5 个区别,你知道几个
  6. 谈谈 Java 的克隆
  7. Excel的基础操作
  8. 使用Servlet上传多张图片——访问提示
  9. 2018蓝桥杯省赛---java---B---1(第几天)
  10. java oschina_简单说说 OSChina 的技术架构