springmvc+spring+hibernate集成cxf

本文详细介绍了如何在Spring MVC项目中整合CXF框架发布Webservice,包括Maven依赖配置、web.xml和spring-cxf.xml配置、接口定义与实现、服务启动及客户端调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说一下背景,我们的系统是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());
    }
}

测试,如果成功,就代表你能让其他人调用,并你也能调用别人。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值