Maven+SpringMVC+CXF整合实现webservice服务的发布与调用

今天有时间把之前遗留的内容给写一下,一直想把webservice服务的发布整合说一下,但是总是忘记了,最近有做了一些关于这一块的东西,就总结下,来记录一下。

简述: WebService开源框架的选择, 目前主流的Web Service框架主要有3种: Axis 2, CXF, 和 Spring WS 
        这里我们 基于CXF创建WebService。

1、webservice服务的简单发布实现,如代码:这里不用web项目,直接用java项目发布

       (1)、接口类:

          

   (2)、实现类如:


(3)、发布服务:


2、使用web项目整合CXF来实现webservice服务的发布。

      1、首先我们需要添加CXF插件包的依赖,我的版本是:2.6.17

             

              <!-- webservice依赖框架CXF -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>${cxf.version}</version>
		</dependency>  
		<!-- webservice依赖框架CXF -->

    2、添加配置文件spring-cxf.xml 具体内容为:

        

  上图中的cxf.xml 和cxf-servlet.xml等这些东西都是在我们引用的包里面,我们只需要将这些文件添加并引进来就可以了,不需要管这些文件在啥位置,cxf.xml是在cxf-core核心文件中。。。。。

3、然后修改web.xml信息,启动加载该spring-cxf.xml文件。

这里需要具体的说一下:因为我在这里跌了一跤:因为我们是SpringMVC项目,我们用的转发器是DispatcherServlet,加载spring配置文件就是用的这个。一开始我是这样写的,我加载的spring配置文件名为dispatcher-servlet.xml ,所以我就把spring-cxf.xml引进到了dispatcher-servlet.xml中。如图:



在我启动的之后访问我的webservice接口服务,直接给出:no services have been found.,没有发现服务,明明启动了服务,而且也正常发布了但就是没有。为啥呢?

原因就是:Spring MVC是通过DispatcherServlet来加载Spring配置文件的,因此不需要在web.xml中配置ContextLoaderListener。但是CXF却需要通过ContextLoaderListener来加载Spring。这样就产生了一个矛盾,如果不配置ContextLoaderListener,CXF就无法正常使用。但如果配置ContextLoaderListener,又会造成Spring的重复加载(DispatcherServlet一次,ContextLoaderListener一次)

为了同时能够实现使用两个加载器,又能够不重复加载,我们需要将两者的配置文件分离开来。这也是我们为啥将spring-cxf.xml分离开dispatcher-servlet.xml来写。

配置方式如下:



启动之后如图:


 

从上面我们可以清楚看到,每个文件都只加载了一次。

我们还要看下他的wsdl文件:如:

看到这个的时候我们的服务就算发布完成了。


3、实现客户端的调用:

我们调用webservice服务,需要获取到他的桩代码,如何获取他的桩代码呢?

    1、服务发布之后会给出一个服务的详细信息,我们能获取他的服务连接(wsdl连接)

         如:http://localhost:8080/demo/webService/helloService?wsdl  能够查看这个描述文件。或者获取到一个.wsdl 为后缀的文件,内容和上面的描述是一样的。然后我们根据 这些东西来生成我们的桩代码。如图:

       



具体流程可以参考:http://www.cnblogs.com/leihenqianshang/articles/5572941.html


     2、实现调用:

          

  

代码如:

package com;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

import com.zpl.webservice.cxf.ISayHello;


/**
 * 实现如何调用webservice接口服务
 * @author zhangpengliang
 *
 */
public class Test01 {

public static void main(String[] args) throws MalformedURLException {
	String nameSpace="http://cxf.webservice.zpl.com/";
	URL url=new URL("http://localhost:8080/demo/webService/helloService?wsdl");
		
	//WebService服务类注解@WebService参数serviceName的值
	final QName SERVICE_NAME = new QName(nameSpace, "SayHelloImplService");
	//WebService服务类注解@WebService参数name的值+”Port”
	final QName PORT_NAME = new QName(nameSpace, "SayHelloImplPort");
	//获取接口实例类
	javax.xml.ws.Service service=javax.xml.ws.Service.create(url, SERVICE_NAME);
	ISayHello inface=service.getPort(PORT_NAME, ISayHello.class);
	inface.write("nihao");

	}

}


到这里基本就完了,但是补充一点知识,也是项目中遇到的:

在我们生成webservice服务的时候,生成的wsdl文件内容必须按照某种格式(客户要求的,没办法)。有一次,客户要求生成的wsdl文件中所用的实体对象属性名称必须大写。

接口方法中引用了某个实例对象,含有属性值name ,一般会显示大写,但是有时候就是小写



所以我们需要这样做:




暂时就这些了吧。。。。。。。。。。





猜你喜欢

转载自blog.csdn.net/try_harder_every_day/article/details/79044374