基于SSM+CXF构建的webservice服务

一、CXF的介绍

Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成。CXF框架是一种基于servlet技术的SOA应用开发框架,要正常运用基于CXF应用框架开发的企业应用,除了CXF应用本身之外,还需要JDK和servlet容器的支持。

二、CXF的准备条件

所需要的jar包:

  xmlbeans-2.4.0.jar

  wss4j-1.5.9.jar

  jetty-server-7.1.6.v20100715.jar

  jetty-util-7.1.6.v20100715.jar

  geronimo-ws-metadata_2.0_spec-1.1.3.jar

  geronimo-activation_1.1_spec-1.1.jar

  geronimo-servlet_3.0_spec-1.0.jar

  velocity-1.6.4.jar

  jaxb-xjc-2.2.1.1.jar

  xml-resolver-1.2.jar

  wsdl4j-1.6.2.jar

  cxf-2.3.0.jar

  XmlSchema-1.4.7.jar

  jaxb-api-2.2.1.jar

  jaxb-impl-2.2.1.1.jar

  neethi-2.0.4.jar

  geronimo-annotation_1.0_spec-1.1.1.jar

  geronimo-stax-api_1.0_spec-1.0.1.jar

下载地址:http://download.csdn.net/detail/ch656409110/5748183   (取自己需要的jar包)

三、创建webservice服务端

第一:导包加入maven依赖:

由于我的是maven项目就直接在pom.xml文件中添加下面依赖就可以了

        <!--cxf-->
        <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-core -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-core</artifactId>
            <version>3.1.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.6</version>
        </dependency>

第二: 在web.xml中配置CXF框架的核心servlet

之后只要我们访问webservice/*这个地址就会进入CXF的servlet中。(对应以下链接的红色标记部分)

    <!--定义一个cxf的servlet-->
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/webservice/*</url-pattern>
    </servlet-mapping>

http://127.0.0.1:8080/ssm/ webservice /HelloWorld?wsdl

第三: 整合Sring配置

接下来是最重要的一部,用Spring整合CXF:

在这之前我有新建一个CXF的包,如下图:


这里有两个主要类

  • HelloWorld接口。
  • 实现HelloWorld接口的HelloWorldImpl类。
    代码如下:
    HelloWorld.java

package cn.temptation.cxf;

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(name="HelloWorld",targetNamespace="http://cxf.temptation.cn/")
public interface HelloWorld {
    public String say(@WebParam(name="str")  String str);
}

注: targetNamespace   与接口中的命名空间一直,一般是接口报名的倒置

其中就只定义了一个简单的say()方法。


============================================================================================

HelloWorldImpl.java

package cn.temptation.cxf;

import javax.jws.WebService;

import org.springframework.stereotype.Component;
@Component("helloWorld")
@WebService(endpointInterface="cn.temptation.cxf.HelloWorld",serviceName="HelloWorld",targetNamespace="http://cxf.temptation.cn/")
public class HelloWorldImpl implements HelloWorld {
	@Override
    public String say(String str) {
        return "Hello"+str;
    }
}

这里就是对say()方法的简单实现。

注: 

    endpointInterface  接口地址的全路径

    serviceName   接口名称

    targetNamespace   与接口中的命名空间一直,一般是接口报名的倒置

=======================================================================

定义CXF的Spring的配置文件:

spring-cxf.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xsi:schemaLocation="
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    
    <import resource="classpath*:META-INF/cxf/cxf.xml" />  
    <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />  
    <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" /> 
     <!-- 自动扫描webService -->
    <context:component-scan base-package="cn.temptation.cxf" />
    <jaxws:endpoint   implementor="cn.temptation.cxf.HelloWorldImpl" address="/HelloWorld"/>
</beans>

其中:

  1. 以下三个为CXF相关的核心配置文件(CXF自带的不用管,直接导入就可以了)
    <import resource="classpath*:META-INF/cxf/cxf.xml" />  
    <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />  
    <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />

    2. 启用 自动扫描webService(一定要把包路径写正确)

<context:component-scan base-package="cn.temptation.cxf" />

    3.对于以下代码

<jaxws:endpoint   implementor="cn.temptation.cxf.HelloWorldImpl" address="/HelloWorld"/>

        implementor :接口实现类的全路径

        address:项目发布后的访问地址(对应以下红色标记)

        http://127.0.0.1:8080/ssm/webservice/HelloWorld?wsdl

=======================================================================

在web.xml的文件中引入CXF的配置文件:(红色标记部分)

         <!-- 配置Spring环境 -->
	 <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring-mybatis.xml,classpath:applicationContext-redis.xml,classpath:spring-cxf.xml</param-value>
	</context-param>
更加具体的配置可以查看官方给出的文档: http://cxf.apache.org/docs/how-do-i-develop-a-service.html
之后我们运行项目输入该地址: http://127.0.0.1:8080/ssm/webservice/HelloWorld?wsdl如果出现如下界面(说明我们的服务端配置已经完成):


三、创建webservice客户端

我们可以任意创建一Java项目或者web项目导入开头所说的相关jar包,然后创建测试类

Test.java

package ssm;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class Test {
	public static void main(String[] args) throws Exception {  
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();  
        Client client = dcf.createClient("http://127.0.0.1:8080/ssm/webservice/HelloWorld?wsdl"); 
        Object[] objects=client.invoke("say","yyyyyyy");   
        //调用web Service//输出调用结果  
        System.out.println(objects[0].toString());  
}  
}

运行main()方法看看是否可以得到对应的结果:

测试方法:

实现类方法如下:


运行结果:






猜你喜欢

转载自blog.csdn.net/guokezhongdeyuzhou/article/details/79566232