基于CXF框架下的SOAP Webservice服务端接口开发
最近对webservice 进行入门学习,网上也是找了很多的学习资料。总得感觉就是这了解点,那了解点。感觉不够系统,不够容易入门。差不多断断续续看了一个星期了,今天小有成果,把客户端,服务端都搞定了。我先写服务端,在说客户端。
框架:服务端webservice是spring+cxf的maven工程。 
环境:jdk1.7+maven3.3.9+tomcat7 
新建maven工程可以参考我之前的博客:使用eclips创建Maven项目。
1.引入开发的依赖。pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zhanglf</groupId>
    <artifactId>springCXFWebserviceDemo01</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>springCXFWebserviceDemo01 Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- 添加 Spring dependency -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
<!-- 添加CXF 依赖 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-core</artifactId>
            <version>3.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.5</version>
        </dependency>
        <!-- 添加CXF 依赖 -->
    </dependencies>
    <build>
        <finalName>cxfService</finalName>
    </build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
2.添加spring整合cxf的配置文件。applicationContext.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: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">
<!-- spring自动扫包 -->
    <context:component-scan base-package="com.zlf" />
<!-- 导入jar包中的cxf配置文件。这里不用写,是写好的放在jar包里,直接引入即可。 -->
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- define web service provider  -->
     <!-- 要暴露给外部调用的接口,address:请求路径 -->  
    <jaxws:endpoint  implementor="com.zlf.impl.HelloWorldImpl"  address="/HelloWorldService" />
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
为了更清晰,我把我的maven工程的结构截出来供参考。
HelloWorld.java是我开放给外部webservice接口,HelloWorldImpl.java是它的实现类。XMLUtil.java是工具类。下面会有具体代码。
3.在web.xml中引入cxf前置拦截器配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>springCXFWebserviceDemo01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
<!-- Spring config-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
<!-- Spring listener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <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>/service/*</url-pattern> 
    </servlet-mapping>
</web-app>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
4.前三步基本把框架搭建好了。下面开始webservice服务端代码开发。
a.新建一个接口:HelloWorld.java
package com.zlf;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
 * @1.这里的@Webservice(targetNamespace="")的作用类似与spring的Controller层中的Controller("/helloworld"),用于定位
 * 你请求的时那个接口,用于区分接口。
 * @2.在客户端有指定用哪个接口中的哪个方法的具体设置代码:
 * call.setOperationName(new QName("serviceTargetName", "sayHello"));
 * 方法中的QName方法的入参说明:
 * new QName(
 * String namespaceURI-定位接口的命名空间:接口注解targetnamespace的值或者wsdl文件<wsdl:definitions中的xmlns:tns="com.serviceTargetName"来锁定targetnamespace的值,
 * 这里如果不是用Axis2框架开发的webservice接口,最好不用wsdl文件<wsdl:definitions中的targetNamespace来确定值的原因在于这里的值来源与接口实现类上的targetNamespace注解的值。如果你接口的实现类中的targetNamespace和接口的不一样,岂不是搞错了。
 * String localPart-接口下定位方法的方法名:就是这里的抽象方法sayHello方法名,或者wsdl文件<wsdl:binding标签下<wsdl:operation name="sayHello"中name的值。
 *          )
 * @3.在要发布的服务接口类开头加上@WebService 在接口的实现类开头也加上@WebService 若两个类不在同一个包中
 *  则还要在实现类上用targetNamespace指明目标命名空间。命名空间的值和接口上的值一样。
 * 
 * @author Administrator
 * 
 *         
 */
@WebService(targetNamespace = "com.serviceTargetName")
public interface HelloWorld {
    //如果接口没有用@WebParam(name = "parameterName")来指明方法入参的参数名称-这里时'parameterName',则在客户端你传入参数时:
    //客户端设置入参:call.addParameter("parameterName", XMLType.XSD_STRING, ParameterMode.IN);
    //会报错:Unmarshalling Error: 意外的元素 (uri:"", local:"parameterName")。所需元素为<{}arg0>
    public String sayHello(@WebParam(name = "parameterName") String name);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
b.实现类HelloWorldImpl.java
package com.zlf.impl;
import javax.jws.WebService;
import org.springframework.stereotype.Component;
import com.zlf.HelloWorld;
/**
 * 由于实现类和接口不在同一个包中。所以要加上targetNamespace属性。
 * 另外,这里的endpointInterface是实现类对应接口的全路径
 * @author Administrator
 */
@WebService(targetNamespace="com.serviceTargetName",endpointInterface="com.zlf.HelloWorld")
@Component("HelloWord")//spring注入用
public class HelloWorldImpl implements HelloWorld {
    @Override
     public String sayHello(String str) {
return "你好,"+str+"  你已成功访问了webservice服务端!" ;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
然后启动项目。访问http://localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService?wsdl。这里注意一个问题-有些网上好像也能用去掉?wsdl的地址http://localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService访问,但这里是不行的,在网页上直接访问是get请求,直接访问不带?wsdl的会出错。所以带上?wsdl访问就行了。页面如下:
访问的地址解析:
部署并启动服务,访问wsdl,本配置访问如下:
http://localhost:8001/webserviceTest/services/testService?wsdl
我的项目部署在本地,端口8080,应用访问名称为webserviceTest,web.xml中cxf拦截配置为/services/*,applicationContext.xml发布相对地址address为/HelloWorldService.
1
2
3
4
页面如下:
到这里webservice服务端就开发成功了~下一次进行客户端开发,我用了两种框架cxf,axis分别来访问webservice接口。
--------------------- 
作者:万米高空 
来源:CSDN 
原文:https://blog.csdn.net/zhanglf02/article/details/73927914 
版权声明:本文为博主原创文章,转载请附上博文链接!
基于CXF框架下的SOAP Webservice服务端接口开发的更多相关文章
- 二十、【.Net开源】EFW框架核心类库之WebService服务
		
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.1:http://pan.baidu.com/s/1qWJjo3U EFW框架实例源代码下载:http://pan.baid ...
 - 基于Laravel框架下使用守护进程supervisor实现定时任务(毫秒)
		
本篇文章给大家带来的内容是关于基于Laravel框架下使用守护进程supervisor实现定时任务(毫秒),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 公司需要实现X分钟内每隔Y秒 ...
 - Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
		
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
 - api服务端接口安全
		
api服务端接口安全性解析 http://blog.csdn.net/tenfyguo/article/details/8225279 常用的基于token的实现方案 http://blog.csdn ...
 - 移动端与PHP服务端接口通信流程设计(增强版)
		
前面讲过:移动端与PHP服务端接口通信流程设计(基础版) 对于 api_token 的校验,其安全性还可再增强: 增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字 ...
 - 移动端与PHP服务端接口通信流程设计(基础版)
		
针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行 ...
 - 移动端与PHP服务端接口通信流程设计(基础版)
		
转载自:http://blog.snsgou.com/post-766.html --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的 ...
 - 基于dubbo框架下的RPC通讯协议性能测试
		
一.前言 Dubbo RPC服务框架支持丰富的传输协议.序列化方式等通讯相关的配置和扩展.dubbo执行一次RPC请求的过程大致如下:消费者(Consumer)向注册中心(Registry)执行RPC ...
 - (一)CXF之发布第一个WebService服务
		
一.CXF入门 1.1 前提 Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS .这些 ...
 
随机推荐
- 【LOJ】#2205. 「HNOI2014」画框
			
题解 我原来根本不会KM 更新每个节点增加的最小值的时候,要忽略那个方访问过的右节点!!! 然后就和最小乘积生成树一样了 代码 #include <iostream> #include & ...
 - 8VC Venture Cup 2016 - Elimination Round F - Group Projects  dp好题
			
F - Group Projects 题目大意:给你n个物品, 每个物品有个权值ai, 把它们分成若干组, 总消耗为每组里的最大值减最小值之和. 问你一共有多少种分组方法. 思路:感觉刚看到的时候的想 ...
 - hdoj2955 Robberies(01背包)
			
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意 有n家银行,每家银行有两个属性:钱数m,概率p,p表示抢这家银行被逮着的概率.有一个人想抢 ...
 - Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总
			
maven项目遇到这类问题基本上是两方面的原因,类对应的依赖没有加载进来.编译器自身的设置和缓存问题. 解决第一类:1.检查项目的pom文件,是否必要的依赖都写清楚了: 2.是否使用自己的私有库,&l ...
 - Java_集合与泛型
			
Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据.在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是 ...
 - Java I/O流输入输出,序列化,NIO,NIO.2
			
Java IO流 File类: File类是java.io包下代表和平台无关的文件和目录,File不能访问文件内容本身. File类基本操作: System.out.println("判断文 ...
 - Initramfs 原理和实践
			
Linux系统启动时使用initramfs (initram file system), initramfs可以在启动早期提供一个用户态环境,借助它可以完成一些内核在启动阶段不易完成的工作.当然ini ...
 - js包
			
1.base.js /*语法: $("选择器") 工厂函数 */ /*寻找页面中name属性值是haha的元素*/ $("[name='haha']&qu ...
 - 常用SQL脚本记录一
			
20.SUM()和 列+ 统计结果时:如果列里有一行为null,SUM函数会忽略它:如果+,则结果集也为NULL了 19 SUBSTRING (expression,startIndex, endIn ...
 - [BZOJ4565][HAOI2016]字符合并(区间状压DP)
			
https://blog.csdn.net/xyz32768/article/details/81591955 首先区间DP和状压DP是比较明显的,设f[L][R][S]为将[L,R]这一段独立操作最 ...