Apache CXF学习-创建基于spring的web service

简介:

引入:

我们上述例子展示了如何从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包然后部署到容器中:

wKiom1MFydCCU636AAinmnawPOc998.jpg

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


最后发布成功,我们通过url   http://localhost:8080/cxf_jaxws_server/services/calc?wsdl 来访问对应的web服务:

wKioL1MFylqRztK-AAkDIvOZt7w427.jpg


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





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1361334,如需转载请自行联系原作者
目录
相关文章
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
657 1
|
缓存 前端开发 Java
打造未来兼容的Web应用:Apache Wicket引领响应式设计的热潮
【9月更文挑战第4天】在软件开发领域,构建响应式Web应用至关重要。Apache Wicket作为一个强大的Java框架,支持响应式设计,确保应用在不同设备上均有出色体验。本文通过示例代码介绍使用Wicket的最佳实践,涵盖页面与组件模型、CSS媒体查询及自定义标记处理器的应用。同时,文章强调了优化加载时间、增强交互性和提升可访问性的重要性,帮助开发者打造高性能且美观的Web应用。
244 3
|
消息中间件 监控 Kafka
Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面
随着大数据技术的发展,Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面,方便管理和监控 Kafka 集群。本文详细介绍了 Kafka Manager 的部署步骤和基本使用方法,包括配置文件的修改、启动命令、API 示例代码等,帮助你快速上手并有效管理 Kafka 集群。
272 0
|
Java API Apache
从零到英雄的蜕变:如何用Apache Wicket打造你的第一个Web应用——不仅是教程,更是编程之旅的启航
【9月更文挑战第4天】学习Apache Wicket这一开源Java Web应用框架是一段激动人心的旅程。本文将指导你通过Maven搭建环境,并创建首个“Hello, World!”应用。从配置`pom.xml`到实现`HelloWorldApplication`类,再到`web.xml`的设置,一步步教你构建与部署简单网页。适合初学者快速上手,体验其简洁API与强大组件化设计的魅力。
471 1
|
Java Spring Apache
Spring Boot邂逅Apache Wicket:一次意想不到的完美邂逅,竟让Web开发变得如此简单?
【8月更文挑战第31天】Apache Wicket与Spring Boot的集成提供了近乎无缝的开发体验。Wicket以其简洁的API和强大的组件化设计著称,而Spring Boot则以开箱即用的便捷性赢得开发者青睐。本文将指导你如何在Spring Boot项目中引入Wicket,通过简单的步骤完成集成配置。首先,创建一个新的Spring Boot项目并在`pom.xml`中添加Wicket相关依赖。
453 0
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
339 0
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
275 0
|
前端开发 JavaScript 开发者
革命性的飞跃:Apache Wicket新特性大揭秘,让你的Web开发之旅如虎添翼!
【8月更文挑战第31天】Apache Wicket作为一个成熟的Java Web框架,持续进化以适应现代Web开发需求。本文介绍Wicket的最新特性,包括响应式布局支持、组件化与模块化开发、异步请求处理、增强的表形处理以及与现代JavaScript框架的集成。通过具体代码示例展示如何利用这些特性构建高效、灵活且用户友好的Web应用程序。
323 0
|
5月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
920 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
471 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式