翻译-使用Spring WebService生成SOAP Web Service
原文链接:http://spring.io/guides/gs/producing-web-service/
生成SOAP web service
该指南将带领你使用Spring创建一个基于SOAP的web service的整个过程。
指南内容
你将创建一个服务,该服务通过一个基于WSDL的SOAP web service向外暴露欧洲国家的数据。
注意:为了简化该示例,你将使用硬编码方式嵌入英国,西班牙及波兰。
准备事项
15分钟
喜爱的编辑器或IDE
JDK1.6或更高版本
Gradle 1.11+或Maven 3.0+
你也可以直接通过该指南导入代码,或通过Spring工具集(Spring Tool Suite,简称STS)通过网页浏览代码,从而帮助你学习该章节内容。源码下载地址: https://github.com/spring-guides/gs-producing-web-service.git。
如何完成该指南
如同大多数的示例教程一样,你可以从头开始并完成每个步骤,或者你也可以跳过已经熟悉的基础章节。无论怎样,最终你要得到可以工作的代码。
想从头开始,请移动到使用Gradle构建章节。
想跳过基础部分,请做以下事情:
下载并解压该向导的源代码,或者使用Git复制一份:
git clone https://github.com/spring-guides/gs-soap-service.git切换到
gs-soap-service/initial跳到添加Spring-WS依赖章节。
当完成后,你可以使用gs-soap-service/complete目录中的代码检查你的结果。
使用Gradle构建
首先你要设置一个基本的build脚本。当构建Spring应用程序时,你可以使用任何构建系统,但是这里只包括了使用Maven和Gradle的代码。如果你两者都不熟悉,请访问使用Gradle构建Java项目或使用Maven构建Java项目。
创建目录结构
在你选择的存放项目的目录中,创建如下的子目录结构。例如,在*nix系统中使用mkdir -p src/main/java/hello。
1 |
|
创建Gradle 构建文件
下面是一个初始的Gradle build文件。
1 |
|
Spring Boot gradle插件提供了很多便利的特性:
将classpath中的所有jar包构建单个可运行的jar包,从而更容易执行和传播服务。
搜索
public static void main()方法并标记为可运行的类。提供了一个内置的依赖管理器,设置依赖版本以匹配Spring Boot依赖。你可以覆盖为任何你希望的版本,但默认会使用Boot选择的版本。
使用Maven构建
首先你需要设置一个基本的构建脚本。你可以使用任何构建系统来构建Spring应用程序,但这里包含了Maven的代码。如果你对Maven不熟,请访问使用Maven构建Java项目。
创建目录结构
在你选择的存放项目的目录中,创建如下的子目录结构。例如,在*nix系统中使用mkdir -p src/main/java/hello。
1 |
|
1 |
|
注意:你可能注意到我们指定了maven-complier-plugin的版本。通常并不推荐这样做。这里主要是为了解决我们的CI系统默认运行在该插件的早期版本(java5之前)的一个问题。
Spring Boot Maven插件提供了很多便利的特性:
将classpath中的所有jar包构建单个可运行的jar包,从而更容易执行和传播服务。
搜索
public static void main()方法并标记为可运行的类。提供了一个内置的依赖管理器,设置依赖版本以匹配Spring Boot依赖。你可以覆盖为任何你希望的版本,但默认会使用Boot选择的版本。
使用Spring工具集构建
如果你拥有Spring工具集,只需简单的直接导入该指南。
添加Spring-ws依赖
你创建的项目需要添加spring-ws-core和wsdl4j依赖到构建文件中。
maven代码:
1 |
|
gradle代码:
1 |
|
创建XML格式来定义领域对象
该web service领域对象被定义在一个XML格式文件中(XSD),Spring-WS将自动导出为一个WSDL文件。
创建一个XSD文件,包含一个操作来返回一个国家的名称,人口,首都和货币。
1 |
|
基于XML格式创建领域类
接下来的步骤是根据XSD文件来创建java类。正确的方式是使用maven或gradle插件在构建时间自动创建。
maven插件配置;
1 |
|
生成的类放置在target/generated-sources/jaxb目录。
gradle插件配置如下,首先需要在构建文件中配置JAXB:
1 |
|
注意:上面的构建文件拥有tag及end注释。目的是为了能够在本指南中更容易抽取出来并做进一步解释。在你的构建文件中无需这些注释。
接下来的步骤是添加任务genJaxb,该任务会生成java类:
1 |
|
由于gradle还没有jaxb插件,所以它调用了一个ant任务,代码看起来比maven稍显复杂。
在maven和gradle两个示例中,JAXB领域对象生成过程被包括在构建工具的生命周期中,所以无需额外步骤来运行。
创建国家仓库
为了给web service提供数据,需要创建一个国家仓库,在本指南中创建了一个硬编码的伪造的国家仓库实现。
1 |
|
创建国家服务终端
为了创建一个service endpoint,x需要一个pojo对象,以及一些Spring WS注解来处理SOAP请求:
1 |
|
@Endpoint向Spring WS注册了该类为一个处理来临的SOAP消息的潜在对象。
@PayloadRoot 被Spring WS用来根据消息的命名空间及localPart来选择处理该请求的方法。
@RequestPayload 指明来临的消息将被映射到该方法的request参数。
@ResponsePayload注解将使得Spring WS将返回值与响应负载映射起来。
注意:在以上代码中,如果你没有运行任务来根据WSDL生成领域对象,那么在你的IDE中io.spring.guides类将会报告编译时错误。
配置web service bean
使用Spring WS相关的bean配置选项创建一个新的类:
1 |
|
这里Spring WS使用了不同的servlet类型来处理SOAP消息:
MessageDispatcherServlet。注入及设置MessageDispatcherServlet给ApplicationContext是非常重要的。如果不这样做,Spring WS无法自动检测到Spring bean。通过给
dispatcherServletbean命名,替代了Spring Boot中默认的DispatcherServlet bean。DefaultMethodEndpointAdapter配置了注解驱动的Spring WS编程模型。这使得使用前面提过的诸如@Endpoint等各种各样的注解成为可能。DefaultWsdl11Defination使用XsdSchema暴露了一个标准的WSDL 1.1。
请注意你需要为MessageDispatcherServlet及DefaultWsdl11Definition制定bean名称,这是非常重要的。Bean名称决定了生成的WSDL文件在哪个web service是可用的。在本例中,WSDL可通过http://<host>:<port>/ws/countries.wsdl来访问。
该配置也使用了WSDL位置servlet转化servlet.setTransformWsdlLocations(true)。如果你访问http://localhost:8080/ws/countries.wsdl,soap:address将拥有正确的值。如果你使用本机的公共IP来访问该WSDL,你将看到的是IP。
创建该程序的可执行文件
尽管我们可以将该程序打包成一个传统的war包并部署到一个外部的应用程序服务器中,但是最简单的方式还是下面所演示的,创建一个能独立运行的应用程序。你可以通过老但好用的java main()方法,将所有文件打包到单个可执行的jar包中。同时,可以借助于Spring的支持内置Tomcat servlet容器作为HTTP运行时,从而无需部署到外部的实例中。
1 |
|
main()方法使用了SpringApplication辅助方法,将Application.class作为参数传递给其自身的run()方法。这告诉Spring读取Application中的注解元数据,并将其作为Spring 应用程序上下文的组件。
@ComponentScan注解告诉Spring递归搜索hello包及其子包中找到被直接或者间接使用了Spring的@Component注解的类。该指令确保了Spring发现并注册CountryRepository及CountriesEndpoint,因为他们被标记为@Component及@Endpoint,这是一种@Component注解。
@EnableAutoConfiguration注解会基于classpath内容切换到默认的合理的行为。例如,由于应用程序依赖Tomcat的内置版本(tomcat-embed-core.jar),Spring会替你设置并配置一个默认的合理的Tomcat服务器。并且该程序还依赖Spring MVC(spring-webmvc.jar),Spring会配置并注册以恶搞Spring MVC DispatcherServlet,根本无需web.xml文件!自动配置是强大的,弹性的机制。请查看API文档获取更多细节。
构建可执行的jar包
你可以创建一个包含所有必须的依赖,类,及资源的可执行的JAR文件。这很方便传输,版本管理以及独立于部署生命周期来部署服务,跨不同的环境,诸如此类。
1 |
|
然后你可以运行WAR文件:
1 |
|
如果你使用的是maven,你可以使用mvn spring-boot:run来运行程序,或者你可以使用mvn clean package构建JAR文件,并使用下面命令来运行:
1 |
|
注意:上面的产出物是以恶搞可运行JAR文件。你也可以创建一个经典的WAR文件。
运行服务
如果使用的是Gradle,可以使用以下命令来运行服务:
1 |
|
注意:如果你使用的是Maven,可以使用以下命令来运行服务:mvn clean package && java -jar target/gs-soap-service-0.1.0.jar。
你也可以通过Gradle直接运行该程序:
1 |
|
注意:使用mvn的话,命令是
mvn spring-boot:run。
可以看到日志输出。该服务应该在几秒钟内启动并运行起来。
测试该程序
现在该程序正在运行,你可以测试它。创建一个名为request.xml文件,包含以下的SOAP请求;
1 |
|
有很多方式来测试该SOAP接口。你可以使用SoapUI等工具,或者如果你使用的是*nix/Mac系统的话,直接可以使用命令行,如下所示:
1 |
|
你将看到如下的响应结果:
1 |
|
注意:输出可能是一个紧凑的XML文档,而不是上面显示的格式友好的文档。如果系统中安装了xmllib2,可以使用
curl <args above> > output.xml | xmllint --format output.xml来查看格式友好的结果。
总结
恭喜你!你使用Spring Web Service开发完成了一个基于SOAP的服务。
翻译-使用Spring WebService生成SOAP Web Service的更多相关文章
- CXF、Spring整合的SOAP Web Service服务端
1.建工程,导入CXFjar包 2.服务接口 package com.cxf.soap; import java.util.List; import javax.jws.WebService; @We ...
- 翻译-使用Spring调用SOAP Web Service
原文链接: http://spring.io/guides/gs/consuming-web-service/ 调用SOAP web service 本指南将指导你使用Spring调用一个基于SOAP ...
- PHP soap Web Service 使用SoapDiscovery.class.php 生成wsdl文件
PHP soap web service 使用wsdl文件 demo: ============================================================== 服 ...
- Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service
准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...
- SOAP web service用AFNetWorking实现请求
问: This is my current call to (asmx) SOAP web service: NSString *soapMessage = [NSString stringWithF ...
- 用.NET WebService Studio调试Web Service解决SOAPAction的问题
话说是这样的,这两天开发一个短信发送功能,客户给了一个 Web Service 地址(没有文档),让我调用就可以发送了, 我在VS 2013添加了服务引用,一切正常,可是执行代理方法时,怎么都报错 R ...
- jboss上的soap web service开发示例
以下示例,由jboss quickstart示例代码得来: 一.创建一个常规的dynamic web项目,建议支持maven ,项目的关键属性参考下图: 二.定义服务接口及参数对象 HelloWorl ...
- REST和SOAP Web Service的区别比较
本文转载自他人的博客,ArcGIS Server 推出了 对 SOAP 和 REST两种接口(用接口类型也许并不准确)类型的支持,本文非常清晰的比较了SOAP和Rest的区别联系! ///////// ...
- 如何在symfony 控制器里面创建soap web service
通过一些工具将一个控制器设置成一个soap服务将会非常简单.首先,你必须安装了php soap扩展.由于php soap扩展现在不能生成wsdl,你要么自己从头开始创建要模使用第三方生成器. php中 ...
随机推荐
- 说说Statement、PreparedStatement和CallableStatement的异同(转)
1.Statement.PreparedStatement和CallableStatement都是接口(interface). 2.Statement继承自Wrapper.PreparedStatem ...
- DbProviderFactory .net数据库工厂模式
http://kb.cnblogs.com/page/72789/ 工厂模式 http://www.cnblogs.com/Ruiky/archive/2012/04/19/2456784.html ...
- the fifth class
1.实际比背景长,怎么做到的? 2个父级一个做头背景一个做尾背景 2.2层,每次自带背景上下是覆盖关系,如何做到 2层?,子浮动 3.标签 4.border可覆盖:margin-bottom 为负 ...
- psp工具需求分析
PSP个人软件过程开发工具需求分析文档 a.业务需求 a.1 背景 二十一世纪是软件开发的黄金时期,有人把过去的十年称作软件高度发展的十年,不可置疑,越来越多的软件设计需求是物联网时代的趋势,越 ...
- 两种状态显示处理. enum , Linq AsEnumerable
1.ENUM protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { GridViewRow ro ...
- C语言小练习一
题目要求:国王将金币作为工资,发放给忠诚的骑士.第1天,骑士收到一枚金币:之后两天(第2天和第3天)里,每天收到两枚金币:之后三天(第4.5.6天)里,每天收到三枚金币:之后四天(第7.8.9.10天 ...
- Python GUI编程--Tkinter
今天看到了GUI编程,书上推荐用wxPython,去官网上看了看,发现Windows的最高支持到2.7,我用的是3.4版本,咋办,用自带的库--Tkinter呗,它是Python的默认GUI库,几乎是 ...
- oracle DBMS_LOCK.SLEEP()的使用
create or replace procedure times isii positive:=1;beginloop dbms_lock.sleep(1);dbms_output.put_line ...
- POJ 2151 Check the difficulty of problems (概率DP)
题意:ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 ,求每队至少解出一题且冠军队至少解出N道题的概率. 析:概率DP,dp[i][j][k] 表示第 i 个队伍,前 j 个题,解出 ...
- multiple definition of `err_sys' 《UNIX环境高级编程》
本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...