WebService与Spring整合部署
服务端(CXF发布webservice):
1、 http://cxf.apache.org/download.html下载 cxf文件包(3.1.18必须使用Java 7或Java 8)。
2、 将下载包的lib文件夹下的jar全部拷贝到spring项目中的lib目录下,注意删除相同的jar包(版本号不同拷贝不会替换)。
3、 删除以下4个jar包:
cxf-services-ws-discovery-api-3.1.5.jar
cxf-services-ws-discovery-service-3.1.5.jar
cxf-services-wsn-api-3.1.5.jar
cxf-services-wsn-core-3.1.5.jar
4、 web.xml配置如下:
<!-- 配置cxf框架 cxf-servlet.xml --> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <init-param> <param-name>config-location</param-name> <param-value>classpath:conf/cxf-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping>
5、 conf目录下添加cxf-servlet.xml文件, cxf-servlet.xml配置如下:
<?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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- 加载提供的服务 --> <jaxws:endpoint id="helloService" address="/MyWebService" implementor="net.evecom.hr.MyWebService"></jaxws:endpoint> </beans>
7、 在net.evecom.hr目录下创建MyWebService类,如下:
package net.evecom.hr; import javax.jws.WebParam; import javax.jws.WebService; @WebService public class MyWebService { public String hiMyService(@WebParam(name = "content") String content) { System.out.println("客户端发送过来了:" + content); return "服务器返回:" + content; } }
8、启动tomcat,访问localhost:8080/项目名/webservice/,查看是否正常启动。
客户端(axis2获取webservice):
1、 http://axis.apache.org/axis2/java/core/download.html下载axis2-1.7.9;
2、 将下载包lib文件夹下的jar包复制到另一个项目lib目录下;
3、 测试代码如下:
package net.evecom.hr; import java.util.Iterator; import javax.xml.namespace.QName; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import com.alibaba.fastjson.JSONObject; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String url = "http://localhost:8080/项目名/webservice/MyWebService?wsdl"; sendWsdl(url, "啊啊啊啊啊"); } public static void sendWsdl(String url, String xmlStr) { JSONObject res = new JSONObject(); try { String endpoint = url.replace("?wsdl", "");// 不需要传?wsdl // 直接引用远程的wsdl文件 Options options = new Options(); options.setTo(new EndpointReference(endpoint)); ServiceClient sender = new ServiceClient(); sender.setOptions(options); OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace("http://hr.evecom.net/", "");// 参数1(uri)=即为wsdl文档的targetNamespace;参数2(prefix)=可不填 OMElement method = fac.createOMElement("hiMyService", omNs);// 方法名 QName qname = new QName("content"); OMElement in0 = fac.createOMElement(qname);// 方法参数 in0.setText(xmlStr); // 参数值 method.addChild(in0); // 添加参数 OMElement resultEle = sender.sendReceive(method);// 调用wsdl System.out.println("调用接口结果:" + resultEle.toString()); Iterator<?> iterator = resultEle.getChildElements(); OMElement result1 = null; while (iterator.hasNext()) { result1 = (OMElement) iterator.next(); System.out.println(result1.getText()); } } catch (AxisFault ex) { ex.printStackTrace(); } } }
4、运行代码,查看是否正常返回
至此,简单的webservice与Spring整合部署完成。
=====================================我是一条分割线============================================
添加拦截器:
- 服务端配置如下:
a) cxf-servlet.xml配置如下:
<?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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <bean id="webServiceInterceptor" class="net.evecom.common.interceptors.WebServiceInterceptor"></bean> <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> <!-- 加载提供的服务 --> <jaxws:endpoint id="webServiceTest" address="/MyWebService" implementor="net.evecom.webservice.hr.MyWebService"> <!-- 添加in拦截器 --> <jaxws:inInterceptors> <ref bean="loggingInInterceptor" /> <ref bean="webServiceInterceptor" /> </jaxws:inInterceptors> <!-- 添加out拦截器 --> <jaxws:outInterceptors> <ref bean="loggingOutInterceptor" /> </jaxws:outInterceptors> </jaxws:endpoint> <!-- <jaxws:server id="webServiceTest" serviceClass="net.evecom.webservice.hr.MyWebService" address="/MyWebService"> <jaxws:serviceBean> <ref bean="MyWebService" /> </jaxws:serviceBean> </jaxws:server> --> </beans>
b) 添加WebServiceInterceptor,代码如下:
/* * Copyright (c) 2005, 2016, EVECOM Technology Co.,Ltd. All rights reserved. * EVECOM PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */ package net.evecom.common.interceptors; import java.util.List; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; import net.evecom.common.util.MD5; public class WebServiceInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private static final String TOKEN = "test"; public WebServiceInterceptor(String phase) { super(phase); } public WebServiceInterceptor() { super(Phase.PRE_INVOKE); } public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); if (headers == null || headers.size() == 0) { throw new Fault(new IllegalArgumentException("没有Header,拦截器实施拦截")); } Header firstHeader = headers.get(0); Element ele = (Element) firstHeader.getObject(); String token = ele.getFirstChild().getTextContent(); if (!token.equals(MD5.parseMD5(TOKEN))) { throw new Fault(new IllegalArgumentException("token不正确")); } } }
- 客户端需要在发送请求时,添加头消息(token=md5.parseMD5(“test”)),代码如下:
// 创建消息头:token=evecomoa SOAPFactory soapFactory = OMAbstractFactory.getSOAP11Factory(); // SOAPHeaderBlock soapHeader = soapFactory.createSOAPHeaderBlock("RequestHeader", omNamespace); // 添加头消息内容 SOAPHeaderBlock soapHeaderBlock = soapFactory.createSOAPHeaderBlock("token", omNamespace); soapHeaderBlock.addChild(soapFactory.createOMText(MD5.parseMD5("test"))); // soapHeader.addChild(soapHeaderBlock); // 将消息头加入到当前消息中 sender.addHeader(soapHeaderBlock);