- 浏览: 145867 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
murphee:
请问下如果要给header设置固定值呢?比如 <so ...
根据WSDL生成带SOAPHeader节点的报文 -
double_f:
这里有更详细解答,来自官方:jse为用于桌面应用软件,及服务器 ...
认识J2EE规范或标准以及J2EE和JEE有什么不同? -
除了你无可取代:
灰常不错的
关于ExtJS插件Spket安装指南 (转) -
hf_jj:
lz 你好 下载你的包发现点了没有生成代码 能否发一份可以的给 ...
Axis2_1.X学习笔记 -
faith515:
兄台 ,你咋个自动添加请求头的啊,我现在遇到一个问题没法解决呢 ...
根据WSDL生成带SOAPHeader节点的报文
请参照:apache-cxf-2.5.1、jdk1.6.0_10
1.如何基于CXF发布接口以及客户端调用请参照下面的网址:
http://www.cnblogs.com/hoojo/tag/WebService/
这里面说了关于CXF的拦截器、与spring的整合以及复杂数据类型的传递。
2.从官方下载的CXF包里面,有个samples文件夹,这里面有各种应用的例子。
3.CXF本身自带的lib包里面就已经包含了spring的包,如下:
如果你的工程师已经是spring平台,这些包是不需要的。
关于具体每个包的作用以及要不要请结合lib文件夹下面的WHICH_JARS文件,这个文件里面有说明。
4.关于如何根据现有的wsdl生成客户端与服务端:
生成客户端命令
wsdl2java -d [数据绑定的类型] -wv [指定wsdl版本] -p [指定生成的包名] -sn [指定wsdl具体的service name] -client [wsdl文件路径]
整个黑线框里就是我根据wsdl生成的客服端代码,有一个报错的类,你只需要把报错方法里面super第三个参数删除就可以了。
PlatformServiceType_PlatformServiceType_Client生成的这个类主要是一个远程调用的测试类(它需要在当前路径下存放wsdl文件)
PlatformServiceType生成的这个接口包括了所有的方法。
其它的都是一些实体bean对象。
一般我们不用它生成的远程测试类方式,而是用一下方式实现:
/** * */ package com.ml.sns.ws.cxf.remote; import java.io.InputStream; import java.util.ArrayList; import java.util.Properties; import java.util.logging.Logger; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.ml.sns.ws.cxf.BabyHealthInfoBean; import com.ml.sns.ws.cxf.BabyInfoBean; import com.ml.sns.ws.cxf.PlatformServiceType; import com.ml.sns.ws.cxf.ResultInfo; import com.ml.sns.ws.cxf.UserInfoBean; import com.ml.sns.ws.cxf.interceptor.AddSoapHeader; /** * @author minglei * */ public class RemoteClient { /** * 日志打印 */ private static final Logger LOG = null;//Logger.getLogger(RemoteClient.class); private static RemoteClient remoteClient = null; private static JaxWsProxyFactoryBean factory = null; private static PlatformServiceType service = null; private static String platformAddress = null; //鉴权属性 public static String authAccount = null; public static String authPassword = null; public static String appID = null; static { init(); } /** * 初始化参数 */ private static void init() { try { // 解析配置文件,获取接口配置信息 InputStream is = RemoteClient.class .getResourceAsStream("/application.properties"); Properties p = new Properties(); p.load(is); //远程服务地址http://127.0.0.1:8088/services/snsService platformAddress = p.getProperty("ws.platform.address"); authAccount = p.getProperty("ws.auth.account"); authPassword = p.getProperty("ws.auth.password"); appID = p.getProperty("ws.platform.appid"); factory = new JaxWsProxyFactoryBean();//创建代理工厂 factory.setServiceClass(PlatformServiceType.class);//服务的接口类----生成的 factory.setAddress(platformAddress);//设置远程服务地址 //构造拦截器列表 ArrayList<Interceptor<?>> list = new ArrayList<Interceptor<?>>(); // 添加soap header list.add(new AddSoapHeader()); // 添加soap消息日志打印 list.add(new org.apache.cxf.interceptor.LoggingOutInterceptor()); factory.setOutInterceptors(list); service = (PlatformServiceType) factory.create();//通过代理工厂获得服务的实现调用类 } catch (Exception e) { if (true) { LOG.info("Failed initialization webservice information." + e.getMessage()); } } } //下面的获得服务的实现调用类,来调用远程的方法 public ResultInfo addBabyInfo(BabyInfoBean babyInfo) { return service.addBabyInfo(babyInfo); } public ResultInfo addUserInfo(UserInfoBean userinfo) { return service.addUserInfo(userinfo); } public ResultInfo addBabyHealthInfo(BabyHealthInfoBean babyHealthInfo) { return service.addBabyHealthInfo(babyHealthInfo); } /** * 获得远程调用接口实例 * @return RemoteClient */ public static RemoteClient getRCInstance() { if(remoteClient ==null) { remoteClient = new RemoteClient(); } return remoteClient; } }
生成服务端命令
wsdl2java -d [数据绑定的类型] -wv [指定wsdl版本] -p [指定生成的包名] -sn [指定wsdl具体的service name] -impl -server[wsdl文件路径]
上图是根据wsdl生成的服务端
生成的PlatformServiceType_PlatformServiceType_Server类是用来启服务的,一般都web程序都不这么用,而是通过容器启动。
蓝线框里面的两个类,一个是接口,一个是接口的实现类这种正好和我们前通过接口发布服务一致,只需要在xml配置就可以了,在这里就不多说了。
所以,我们的业务可以在接口的实现类里面调用。
5.换SOAP消息头添加与解析:
在远程客服端添加消息头,通过拦截器;在前面4节的代码中已经实现了添加消息头功能。
/** * */ package other.interceptor; import java.util.List; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapHeader; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; import org.apache.cxf.headers.Header; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.Phase; import org.w3c.dom.Document; import org.w3c.dom.Element; import other.Utils; /** * @author minglei * */ public class AddSoapHeader extends AbstractSoapInterceptor { private static String nameURI = "http://webservice.iBaby.huawei.com/"; public AddSoapHeader() { super(Phase.WRITE); } /** * 在发送报文前,添加消息头鉴权 */ public void handleMessage(SoapMessage message) throws Fault { /** * 在消息投头中添加复杂对象节点,多层嵌套 * <soap:Header> * <tns:RequestSOAPHeader xmlns:tns="http://webservice.iBaby.huawei.com/"> * <tns:timestamp xmlns="http://webservice.iBaby.huawei.com/">20120118162416</tns:timestamp> * <tns:account xmlns="http://webservice.iBaby.huawei.com/">ming</tns:account> * <tns:authenToken xmlns="http://webservice.iBaby.huawei.com/">......</tns:authenToken> * </tns:RequestSOAPHeader> * </soap:Header> */ addSoapHeader1(message); /** * 在消息投头中添加节点,报文如下: * <soap:Header> * <timestamp xmlns="http://webservice.iBaby.huawei.com/">20120118162416</timestamp> * <account xmlns="http://webservice.iBaby.huawei.com/">ming</account> * <authenToken xmlns="http://webservice.iBaby.huawei.com/">......</authenToken> * </soap:Header> */ addSoapHeader2(message); //注意方法同时只能调用一个 } /** * @param message */ private void addSoapHeader1(SoapMessage message) { QName qname = new QName("RequestSOAPHeader"); Document doc = DOMUtils.createDocument(); // 自定义节点 Element timestamp = doc.createElement("tns:timestamp"); timestamp.setTextContent(Utils.getSystemTime()); Element account = doc.createElement("tns:account"); account.setTextContent("uououo"); //鉴权authenToken Element pass = doc.createElement("tns:authenToken"); pass.setTextContent(Utils.encryptSHA256("123456")); Element root = doc.createElementNS(nameURI, "tns:RequestSOAPHeader"); root.appendChild(timestamp); root.appendChild(account); root.appendChild(pass); SoapHeader head = new SoapHeader(qname, root); List<Header> headers = message.getHeaders(); headers.add(head); } /** * @param message */ private void addSoapHeader2(SoapMessage message) { //时间戳 Document doc = DOMUtils.createDocument(); QName qname = new QName("timestamp"); Element timestamp = doc.createElementNS(nameURI, "timestamp"); timestamp.setTextContent(Utils.getSystemTime()); SoapHeader headTime = new SoapHeader(qname, timestamp); //账号 QName qname2 = new QName("account"); Element account = doc.createElementNS(nameURI, "account"); account.setTextContent("mlmlml"); SoapHeader headaAccount = new SoapHeader(qname2, account); // 鉴权authenToken QName qname3 = new QName("authenToken"); Element pass = doc.createElementNS(nameURI, "authenToken"); pass.setTextContent(Utils.encryptSHA256("123456")); SoapHeader headPass = new SoapHeader(qname3, pass); List<Header> headers = message.getHeaders(); headers.add(headTime); headers.add(headaAccount); headers.add(headPass); } }
在服务端添加解析消息头的拦截器,然后添加到配置文件中,结合1节网址里面的内容
/** * */ package other.interceptor; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.NodeList; /** */ /** * * @Title:获取soap头信息 * * @Description: * * @Copyright: * * @author minglei * @version 1.00.000 * */ public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> { private SAAJInInterceptor saa = new SAAJInInterceptor(); public ReadSoapHeader() { super(Phase.PRE_PROTOCOL); getAfter().add(SAAJInInterceptor.class.getName()); } public void handleMessage(SoapMessage message) throws Fault { SOAPMessage mess = message.getContent(SOAPMessage.class); if (mess == null) { saa.handleMessage(message); mess = message.getContent(SOAPMessage.class); } SOAPHeader head = null; try { head = mess.getSOAPHeader(); } catch (SOAPException e) { e.printStackTrace(); } if (head == null) { return; } try { // 读取自定义的节点 NodeList nodes = head.getElementsByTagName("tns:account"); NodeList nodepass = head.getElementsByTagName("tns:authenToken"); // 获取节点值,简单认证 if (nodes.item(0).getTextContent().equals("wdw")) { if (nodepass.item(0).getTextContent().equals("wdwsb")) { System.out.println("认证成功"); } } else { SOAPException soapExc = new SOAPException("认证错误"); throw new Fault(soapExc); } } catch (Exception e) { SOAPException soapExc = new SOAPException("认证错误"); throw new Fault(soapExc); } } }
发表评论
-
根据一定规则的excel生成wsdl文件(工具源码)
2011-10-21 10:41 2559前一段时间,公司项目 ... -
Axis2_1.X学习笔记
2011-10-19 21:05 3856最近项目组经常的做SOAP接口,给 ... -
关于MyEclipse安装Axis2插件
2011-10-19 15:25 932关于插件安装 引用链接: (1) http://ww ... -
关于SOAP请求报文里的元素与wsdl中元素属性的关系
2011-09-29 23:27 5135关于SOAP请求参数顺序以及对象下面参数不全与wsdl中元素属 ... -
根据WSDL生成带SOAPHeader节点的报文
2011-09-29 23:18 13077在soap头鉴权中,往往我们要手动的添加SO ... -
Axis1.x版本的学习笔记
2011-09-28 00:09 3882用axis1.4发布自己的wsdl服务详解 ... -
WebService学习片段
2011-09-27 23:17 962SOA(Service-Oriented Architectu ... -
学习webService各种场景应用资料
2009-12-21 08:09 1131学习webService各种场景应用资料
相关推荐
通过上述步骤,我们成功实现了使用CXF打印SOAP报文的功能,并能够有效地记录WebService的日志信息。这对于调试和维护基于CXF的服务来说是非常有用的。此外,通过扩展此类自定义拦截器,还可以添加更多的功能,如安全...
本篇将详细讲解如何使用Apache CXF框架在同一系统中同时实现这两种类型的Web服务接口。 Apache CXF是一个流行的开源Java框架,用于构建和开发Web服务。它支持SOAP、RESTful等多种Web服务规范,使得开发者能够灵活地...
6. **CXF_Spring中的示例**:在提供的压缩包文件"CXF_Spring"中,可能包含了示例代码、配置文件以及相关文档,用于演示如何整合CXF和Spring进行SOAP接口开发。通过研究这些示例,开发者可以更好地理解和实践上述知识...
使用CXF开发SOAP服务通常包括以下几个步骤: 1. **配置Maven依赖**:为了使用CXF,首先需要在项目的Maven配置文件pom.xml中添加相应的依赖项。这将确保构建过程中可以获取到CXF库和其他必要的组件。 2. **编写WS...
本资源"SOAP接口开发chm"主要涵盖了使用AXIS和CXF框架进行SOAP接口开发的相关知识。 1. **SOAP基础知识**: SOAP消息是XML文档,由四个主要部分组成:Envelope、Header、Body和Fault。Envelope定义了消息的结构,...
本实例将深入探讨如何使用CXF创建和消费SOAP服务,以及在实际项目中的应用。 1. **SOAP基础** SOAP是一种轻量级的消息传递协议,通过HTTP、SMTP等传输协议进行通信。它由三个主要部分组成:SOAP Envelope定义消息...
【描述】"使用CXF开发REST接口时,我们关注的是最小化依赖,以降低项目复杂性和提升效率。这些最小化的JAR包包括了CXF的核心功能,使开发者能够快速地搭建和运行REST服务。" 以下是开发CXF REST服务所必需的关键...
在开发基于Web服务的应用时,SOAP(Simple Object Access Protocol)头部信息经常被用来传递额外的认证、授权或元数据信息。Apache CXF是一个强大的开源框架,用于构建和部署SOAP和RESTful Web服务。本篇文章将深入...
通过以上知识点的学习和实践,你可以掌握如何使用Java调用SOAP接口,以及如何根据具体需求进行定制。在处理天气信息这样的案例中,理解SOAP协议和相关API的使用,将使你能够轻松地与各种Web服务进行交互。
以下是使用CXF开发SOAP服务的基本步骤: 1. **创建服务接口**:定义服务的业务方法,这些方法将作为SOAP接口暴露给客户端调用。例如: ```java @WebService public interface HelloWorldService { @WebMethod ...
【标题】"CXF-SOAP搭建WebService服务端demo"主要涵盖了使用Apache CXF框架、Spring框架、Maven构建工具以及SOAP协议来创建一个Web服务端的实例。这个过程涉及了多个关键知识点,下面将详细阐述。 【SOAP】:简单...
总结来说,通过CXF开发基于SOAP协议的Web Service接口,需要以下几个步骤: 1. 添加CXF、Spring和JUnit等依赖。 2. 配置`web.xml`以启动CXF Servlet和设置字符编码过滤器。 3. 创建服务接口和实现。 4. 在Spring配置...
下面我们将深入探讨Spring与CXF整合开发Web服务接口所需的知识点。 1. **Spring框架**: - **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,它允许将组件间的依赖关系通过配置文件或注解来管理...
标题 "spring,xfire开发soap接口" 暗示了我们即将探讨的是如何使用Spring框架与XFire库来创建SOAP(简单对象访问协议)服务。SOAP是一种基于XML的协议,常用于Web服务,允许不同系统间交换结构化信息。在这个话题中...
在IT行业中,CXF是一个广泛使用的开源框架,用于构建和开发Web服务,包括SOAP和RESTful接口。本篇文章将深入探讨如何使用CXF、Spring、Maven等技术栈来发布一个支持HTTP请求和SOAP调用的RestFul接口。 首先,我们...
本教程将通过一个具体的"CXF+Spring接口实例"来探讨如何使用这两种技术实现Web服务并进行测试。 首先,让我们理解CXF的核心功能。CXF允许开发者使用Java编程语言来实现Web服务接口,这被称为Java API for RESTful ...
### 基于CXF的WebService接口开发及调用步骤详解 #### 一、概述 在当前企业级应用开发中,服务化与微服务架构逐渐成为主流趋势,而WebService作为一种跨语言、跨平台的服务交互方式,在众多场景下仍然发挥着重要...
在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而Cxf则是一个强大的服务导向架构(SOA)工具集,主要用于构建和开发Web服务。本示例将探讨如何通过Spring集成Cxf来暴露Web服务,帮助开发者更好地...
本范例主要涵盖了基于SOAP消息和REST风格的CXF开发,以及如何利用Spring发布SOAP和REST的Web服务。通过深入理解这些知识点,开发者可以更加熟练地运用CXF来实现高效、灵活的服务接口。 【SOAP消息的CXF开发】 SOAP...