首先说一下背景,我们的系统是springmvc+spring+hibernate,已经能正常运行,现在要开发webservice,选用cxf。
1、maven依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.4</version>
</dependency>
2、web.xml配置
在配置好ssh的基础上添加如下cxf的配置:
<listener>
<description>Define spring4.x listener.</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<description>Define applicationContext.xml location.</description>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/webservice/spring-cxf.xml<!--配置你的cxf的配置文件路径-->
</param-value>
</context-param>
原因是因为cxf的spring容器必须使用ContextLoadListener来启动,而spring MVC采用的DispatcherServlet来启动的,所以无法加载cxf的服务,于是采用 博文中的方法,分开加载,只将cxf的配置剥离出来。
3、spring-cxf.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://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-lazy-init="true">
<!-- 引cxf的一些核心配置 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<!--发布webservice-->
<!-- WebService的实现Bean定义 -->
<!--web.xml配置了webservice的访问路径/server/*,那么/server/hello?wsdl就是该webservice的访问路径-->
<bean id="HelloService" class="com.newtouch.iesc.ma.webserviceImp.HelloServiceImp" />
<!-- jax-ws endpoint定义 -->
<jaxws:endpoint implementor="#HelloService" address="/hello"/>
<!--发布webservice-->
</beans>
4、java的编写
1、定义接口
package com.newtouch.iesc.ma.webservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(targetNamespace = "http://webservice.ma.iesc.newtouch.com/")
public interface HelloService {
@WebMethod(action = "http://webservice.ma.iesc.newtouch.com/sayHello")
public String sayHello(@WebParam(name = "userName",targetNamespace="http://webservice.ma.iesc.newtouch.com/")String userName) ;
}
2、实现接口
package com.newtouch.iesc.ma.webservice;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* @Description: java类作用描述
* @Author: PZHOU
* @CreateDate: 2019-4-26$ 14:35$
*/
@WebService(endpointInterface="com.newtouch.iesc.ma.webservice.HelloService",targetNamespace="http://webservice.ma.iesc.newtouch.com/")
public class HelloServiceImp implements HelloService{
@Override
public String sayHello(@WebParam(name = "userName",targetNamespace="http://webservice.ma.iesc.newtouch.com/") String userName) {
StringBuffer sb = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.append("<userBean>");
sb.append("<userName>" + userName + "</userName>");
sb.append("</userBean>");
return sb.toString();
}
}
5、启动项目:
访问:http://localhost:8080/项目名/webservice/
出现如下页面,则部署成功:
点击链接会出现如下页面:
大功告成,服务端发布成功!!!
如果你现在觉得已经完成的,那就说明你太嫰了,因为客户端才是大头,因为一个客户端,我花了两天时间。
客户端开发:(asix框架)
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>${axis1.version}</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>${axis1.version}</version>
</dependency>
<axis1.version>1.4</axis1.version>
客户端代码:
package com.newtouch.iesc.ma.utils;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.Constants;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
/**
* 调用webService的工具类
*/
public class CallWebServiceUtil {
/**
* 取得webservice操作
*
* @param strXml
* :传入参数,为xml的类型
* @param method
* :webservice 方法名
* @param url
* :wsdl路径
* @param nameSpace
* :webservice命名空间
* @param parameter
* :传入方法的参数名,只能为一个
* @return
*/
public static Object getWebService(String strXml, String method, String url, String nameSpace, String[] parameter) {
Service service = new Service();
Object obj = null;
Call call;
try {
// 创建连接
call = (Call) service.createCall();
// 设置webservice地址
call.setTargetEndpointAddress(new URL(url));
// 设置调用的方法名(包含方法所在的命名空间)
call.setOperationName(new QName(nameSpace, method));
// 设置调用时需要传入的参数(包含参数所属方法所对应的命名空间)
call.addParameter(new QName(nameSpace, parameter[0]),
XMLType.XSD_STRING,
ParameterMode.IN);
call.setUseSOAPAction(true);
// 设置返回参数类型
call.setReturnType(Constants.XSD_STRING);
// 设置操作方法完整路径(包含命名空间与方法名)
call.setSOAPActionURI(nameSpace + method);
// 执行调用过程并传入调用时所需参数
obj = call.invoke(new Object[] { strXml });
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
调用客户端:
package com.newtouch.iesc.ma;
import com.newtouch.iesc.ma.utils.CallWebServiceUtil;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
/**
* 使用axis调用cxf发布的webservice接口
* @author moon
*
*/
@WebService(targetNamespace = "http://webservice.ma.iesc.newtouch.com/")
public class CxfClient {
private static String getXml(String name) {
StringBuffer sb = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.append("<userBean>");
sb.append("<userName>" + name + "</userName>");
sb.append("</userBean>");
return sb.toString();
}
public static void main(String[] args) throws Exception {
Object object = CallWebServiceUtil.getWebService(getXml("zhou"),"sayHello","http://localhost:8080/account_war_exploded/webService/sayHello?wsdl","http://webservice.ma.iesc.newtouch.com/",new String[]{"userName"});
System.out.print(object.toString());
}
}
测试,如果成功,就代表你能让其他人调用,并你也能调用别人。