`
my_java_life
  • 浏览: 145867 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

用CXF开发SOAP接口

 
阅读更多

请参照: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);
		}
	}
}

 

  • 大小: 2.4 KB
  • 大小: 57.6 KB
  • 大小: 42.9 KB
分享到:
评论

相关推荐

    CXF打印SOAP报文,记录WebService日志

    通过上述步骤,我们成功实现了使用CXF打印SOAP报文的功能,并能够有效地记录WebService的日志信息。这对于调试和维护基于CXF的服务来说是非常有用的。此外,通过扩展此类自定义拦截器,还可以添加更多的功能,如安全...

    在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口

    本篇将详细讲解如何使用Apache CXF框架在同一系统中同时实现这两种类型的Web服务接口。 Apache CXF是一个流行的开源Java框架,用于构建和开发Web服务。它支持SOAP、RESTful等多种Web服务规范,使得开发者能够灵活地...

    CXF整合spring实现SOAP接口开发

    6. **CXF_Spring中的示例**:在提供的压缩包文件"CXF_Spring"中,可能包含了示例代码、配置文件以及相关文档,用于演示如何整合CXF和Spring进行SOAP接口开发。通过研究这些示例,开发者可以更好地理解和实践上述知识...

    Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务 - ImportNew1

    使用CXF开发SOAP服务通常包括以下几个步骤: 1. **配置Maven依赖**:为了使用CXF,首先需要在项目的Maven配置文件pom.xml中添加相应的依赖项。这将确保构建过程中可以获取到CXF库和其他必要的组件。 2. **编写WS...

    SOAP接口开发chm

    本资源"SOAP接口开发chm"主要涵盖了使用AXIS和CXF框架进行SOAP接口开发的相关知识。 1. **SOAP基础知识**: SOAP消息是XML文档,由四个主要部分组成:Envelope、Header、Body和Fault。Envelope定义了消息的结构,...

    CXF SOAP应用实例

    本实例将深入探讨如何使用CXF创建和消费SOAP服务,以及在实际项目中的应用。 1. **SOAP基础** SOAP是一种轻量级的消息传递协议,通过HTTP、SMTP等传输协议进行通信。它由三个主要部分组成:SOAP Envelope定义消息...

    cxf开发rest风格接口jar

    【描述】"使用CXF开发REST接口时,我们关注的是最小化依赖,以降低项目复杂性和提升效率。这些最小化的JAR包包括了CXF的核心功能,使开发者能够快速地搭建和运行REST服务。" 以下是开发CXF REST服务所必需的关键...

    CXF 添加soap 头部信息.zip_CXF增加soap头验证_bluex8z_cxf_meltedkw7_soap信息头

    在开发基于Web服务的应用时,SOAP(Simple Object Access Protocol)头部信息经常被用来传递额外的认证、授权或元数据信息。Apache CXF是一个强大的开源框架,用于构建和部署SOAP和RESTful Web服务。本篇文章将深入...

    java调用soap接口案例

    通过以上知识点的学习和实践,你可以掌握如何使用Java调用SOAP接口,以及如何根据具体需求进行定制。在处理天气信息这样的案例中,理解SOAP协议和相关API的使用,将使你能够轻松地与各种Web服务进行交互。

    基于Soap协议下CXF框架开发Webservice

    以下是使用CXF开发SOAP服务的基本步骤: 1. **创建服务接口**:定义服务的业务方法,这些方法将作为SOAP接口暴露给客户端调用。例如: ```java @WebService public interface HelloWorldService { @WebMethod ...

    CXF-SOAP搭建WebService服务端demo

    【标题】"CXF-SOAP搭建WebService服务端demo"主要涵盖了使用Apache CXF框架、Spring框架、Maven构建工具以及SOAP协议来创建一个Web服务端的实例。这个过程涉及了多个关键知识点,下面将详细阐述。 【SOAP】:简单...

    通过CXF开发webService接口(soap协议、maven项目).pdf

    总结来说,通过CXF开发基于SOAP协议的Web Service接口,需要以下几个步骤: 1. 添加CXF、Spring和JUnit等依赖。 2. 配置`web.xml`以启动CXF Servlet和设置字符编码过滤器。 3. 创建服务接口和实现。 4. 在Spring配置...

    spring整合CXF开发webService接口所需的全部jar包

    下面我们将深入探讨Spring与CXF整合开发Web服务接口所需的知识点。 1. **Spring框架**: - **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,它允许将组件间的依赖关系通过配置文件或注解来管理...

    spring,xfire开发soap接口

    标题 "spring,xfire开发soap接口" 暗示了我们即将探讨的是如何使用Spring框架与XFire库来创建SOAP(简单对象访问协议)服务。SOAP是一种基于XML的协议,常用于Web服务,允许不同系统间交换结构化信息。在这个话题中...

    cxf发布RestFul接口。 maven

    在IT行业中,CXF是一个广泛使用的开源框架,用于构建和开发Web服务,包括SOAP和RESTful接口。本篇文章将深入探讨如何使用CXF、Spring、Maven等技术栈来发布一个支持HTTP请求和SOAP调用的RestFul接口。 首先,我们...

    cxf+spring接口实例

    本教程将通过一个具体的"CXF+Spring接口实例"来探讨如何使用这两种技术实现Web服务并进行测试。 首先,让我们理解CXF的核心功能。CXF允许开发者使用Java编程语言来实现Web服务接口,这被称为Java API for RESTful ...

    基于cxf 的webService 接口开发及调用步骤文档

    ### 基于CXF的WebService接口开发及调用步骤详解 #### 一、概述 在当前企业级应用开发中,服务化与微服务架构逐渐成为主流趋势,而WebService作为一种跨语言、跨平台的服务交互方式,在众多场景下仍然发挥着重要...

    Spring集成Cxf暴露WebServices示例

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而Cxf则是一个强大的服务导向架构(SOA)工具集,主要用于构建和开发Web服务。本示例将探讨如何通过Spring集成Cxf来暴露Web服务,帮助开发者更好地...

    cxf开发范例

    本范例主要涵盖了基于SOAP消息和REST风格的CXF开发,以及如何利用Spring发布SOAP和REST的Web服务。通过深入理解这些知识点,开发者可以更加熟练地运用CXF来实现高效、灵活的服务接口。 【SOAP消息的CXF开发】 SOAP...

Global site tag (gtag.js) - Google Analytics