博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache CXF学习-创建基于spring的web service
阅读量:6081 次
发布时间:2019-06-20

本文共 3437 字,大约阅读时间需要 11 分钟。

引入:

我们上述例子展示了如何从java code开始来开发一个基于jaxws的web service并使其对外服务,但是我们创建web service的过程,其实并不是由spring来完成的,我们这里讲展示如何利用spring配置文件来完成这件事情。

实践:

其实很简单,只要稍作修改就可以了。

首先,在web.xml中,我们定义一个spring的应用上下文文件(反正我不太喜欢它默认的applicationContext.xml,因为我们自己起有意义的名字会让应用更加有可控制性并且提高可读性),并且被ContextLoader所载入,为了节省篇幅,我们只贴代码片断了,大家都知道放在哪里。


1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 这里演示cxf怎么和Spring容器集成,从而利用Spring的配置文件来管理发布的web service -->
    
<!-- BEGIN SPRING BEAN CONFIGURATION-->
    
<
context-param
>
        
<
param-name
>contextConfigLocation</
param-name
>
        
<
param-value
>WEB-INF/beans.xml</
param-value
>
    
</
context-param
>
                                                                                                                                                                                                                                                                                                                                                                                                                                          
    
<
listener
>
        
<
listener-class
>
        
org.springframework.web.context.ContextLoaderListener
        
</
listener-class
>
    
</
listener
>
    
<!-- END SPRING BEAN CONFIGURATION -->

所以我们必须在WEB-INF/beans.xml中定义一个bean的配置文件,其实大体上和我们上文中的cxf-servlet.xml差不多,只不过我们要导入一些spring配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
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://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 导入cxf中的spring的一些配置文件,他们都在cxf-<version>.jar文件中 -->
<
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" 
/>
<
jaxws:endpoint
id
=
"calcService"
implementor
=
"com.charles.cxfstudy.server.services.CalcServiceImpl"
address
=
"/calc" 
/>
</
beans
>

从这里可以看出,显著的不同在于,我们用<import>元素导入了3个配置文件,他们都和spring相关,他们中定义的bean才会负责创建和管理web service,这些配置文件都在类路径下的 cxf-<version>.jar的jar包中。

然后我们在下面就可以定义我们的要创建的web service的endpoint了,这里我们用<endpoint>元素来给定要创建的webservice是用具体的什么实现类来创建的,并且绑定到什么路径上,最后赋予一个被bean容器引用的id.

因为在上面配置文件中我们定义了一个CalcServiceImpl,所以我们必须为其写一个服务接口和服务实现类:

服务接口如下,为了简单起见,我们计算服务只提供2个整数的相加运算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 
* 这是一个web服务接口定义,假设这里定义了一个计算服务,并且简单起见只有加法与水暖
 
*/
package 
com.charles.cxfstudy.server.services;
import 
javax.jws.WebParam;
import 
javax.jws.WebService;
/**
 
* @author charles.wang
 
*
 
*/
@WebService
public 
interface 
ICalcService {
                                                                                                                                                                                                                                                                    
    
/**
     
* 计算两个整数类型的和
     
* @param val1   第一个运算子
     
* @param val2   第二个运算子
     
* @return     和
     
*/
    
int 
calcSum (
@WebParam
(name=
"a"
)
int 
val1,
@WebParam
(name=
"b"
)
int 
val2);
}

这里我第一次使用了@WebParam的注解,这个目的是为了告诉CXF引擎在生成对应的wsdl文件时候,不要把这些参数映射到参数名val1,val2上,而是映射到这里我用name属性指定的a和b上。

然后就定义一个服务实现类,和以前完全一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 
* 服务实现类,提供计算服务
 
*/
package 
com.charles.cxfstudy.server.services;
import 
javax.jws.WebService;
/**
 
* @author charles.wang
 
*
 
*/
@WebService
(endpointInterface=
"com.charles.cxfstudy.server.services.ICalcService"
)
public 
class 
CalcServiceImpl 
implements 
ICalcService {
    
/**
     
* 计算两个整数类型的和
     
* @param val1   第一个运算子
     
* @param val2   第二个运算子
     
* @return     和
     
*/
    
@Override
    
public 
int 
calcSum(
int 
val1, 
int 
val2) {
        
return 
val1+val2;
    
}
}

现在就大功告成了,我们用maven构建成二进制war包然后部署到容器中:

为了对比我们这个实验和上面实验,我吧2种方式同时放在一个工程下,如图 /calc的服务发布过程我们采用了spring的机制,而上文实验的/greeting我们没有采用spring,而是用原生的JAX-WS来负责发布,我们还是可以清晰的看到这2个过程是有区别的

最后发布成功,我们通过url    来访问对应的web服务:

事实证明,这是正确的,如果细心点,还可以发现,我们这里的方法"calcSum"定义的参数列表( 位于 <xs:complexType name="calcSum">中,参数名字是a和b而不是val1,val2,这表明我们在服务接口定义中的@WebParam的设定生效了。

本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1361334,如需转载请自行联系原作者
你可能感兴趣的文章
判断浏览器类型
查看>>
CentOS yum升级GCC到4.8
查看>>
GridView视图(BaseAdapter)
查看>>
Postfix 利用用户别名自动转发邮件
查看>>
fcitx要设定local才能用~~
查看>>
linux ls命令详解
查看>>
磁盘-使用fdisk格式化硬盘
查看>>
VMware KEY
查看>>
用递归实现的二分查找
查看>>
snmp启动失败
查看>>
Window.Open参数详解
查看>>
linux负载均衡总结性说明;四层负载和七层负载有什么区别
查看>>
转帖-Centos修改时区时间日期
查看>>
IPv4地址
查看>>
MongoDB——第五天 主从复制
查看>>
mysql常用命令操作
查看>>
学习笔记2:java中Thread类与线程的创建
查看>>
php 不支持 curl 的终极解决方案
查看>>
安装mantis 2.11.1
查看>>
zabbix 3.4监控zookeeper3.4
查看>>