Spring Web Services 第一个应用 Spring Web Services 环境设置 Spring Web Services 静态WSDL 让我们开始使用Spring-WS Framework编写一个基于SOAP的实际Web服务。在我们开始使用Spring- WS框架编写第一个示例之前,我们必须确保正确设置Spring-WS环境,如Spring Web Services - 环境设置一章中所述。我们假设读者具有Eclipse IDE的一些基本工作知识。 因此,让我们继续编写一个简单的Spring WS应用程序,它将公开一个Web服务方法来预订HR门户中的休假。 Contract-first Approach Spring-WS使用契约优先方法,这意味着我们应该在编写任何基于JAVA的实现代码之前准备好 XML 结构 。我们正在定义一个LeaveRequest对象,它有子对象 - Leave和Employee。 以下是必需的XML构造 Leave.xml <Leave xmlns = "http://codingdict.com/hr/schemas"> <StartDate>2016-07-03</StartDate> <EndDate>2016-07-07</EndDate> </Leave> Employee.xml <Employee xmlns = "http://codingdict.com/hr/schemas"> <Number>404</Number> <FirstName>Mahesh</FirstName> <LastName>Parashar</LastName> </Employee> LeaveRequest.xml <LeaveRequest xmlns = "http://codingdict.com/hr/schemas"> <Leave> <StartDate>2016-07-03</StartDate> <EndDate>2016-07-07</EndDate> </Leave> <Employee> <Number>404</Number> <FirstName>Mahesh</FirstName> <LastName>Parashar</LastName> </Employee> </LeaveRequest> hr.xsd <xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema" xmlns:hr = "http://codingdict.com/hr/schemas" elementFormDefault = "qualified" targetNamespace = "http://codingdict.com/hr/schemas"> <xs:element name = "LeaveRequest"> <xs:complexType> <xs:all> <xs:element name = "Leave" type = "hr:LeaveType"/> <xs:element name = "Employee" type = "hr:EmployeeType"/> </xs:all> </xs:complexType> </xs:element> <xs:complexType name = "LeaveType"> <xs:sequence> <xs:element name = "StartDate" type = "xs:date"/> <xs:element name = "EndDate" type = "xs:date"/> </xs:sequence> </xs:complexType> <xs:complexType name = "EmployeeType"> <xs:sequence> <xs:element name = "Number" type = "xs:integer"/> <xs:element name = "FirstName" type = "xs:string"/> <xs:element name = "LastName" type = "xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> 创建项目 现在让我们打开命令控制台,转到C:\MVN目录并执行以下 mvn 命令。 C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws -DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.codingdict.hr -DartifactId = leaveService Maven将开始处理并将创建完整的Java Application Project Structure。 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Using property: groupId = com.codingdict.hr [INFO] Using property: artifactId = leaveService Define value for property 'version': 1.0-SNAPSHOT: : [INFO] Using property: package = com.codingdict.hr Confirm properties configuration: groupId: com.codingdict.hr artifactId: leaveService version: 1.0-SNAPSHOT package: com.codingdict.hr Y: : [INFO] ------------------------------------------------------------------------- --- [INFO] Using following parameters for creating project from Old (1.x) Archetype: spring-ws-archetype:2.0.0-M1 [INFO] ------------------------------------------------------------------------- --- [INFO] Parameter: groupId, Value: com.codingdict.hr [INFO] Parameter: packageName, Value: com.codingdict.hr [INFO] Parameter: package, Value: com.codingdict.hr [INFO] Parameter: artifactId, Value: leaveService [INFO] Parameter: basedir, Value: C:\mvn [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: C:\mvn\leaveService [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 35.989 s [INFO] Finished at: 2017-01-21T11:18:31+05:30 [INFO] Final Memory: 17M/178M [INFO] ------------------------------------------------------------------------ 现在转到 C:/MVN 目录。我们将看到一个名为 leaveService 的java应用程序项目(在artifactId中指定)。更新pom.xml并在以下文件夹中添加HumanResourceService.java和HumanResourceServiceImpl.java C:\ MVN \ leaveService \ src \ main \ java \ com \ codingdict \ hr \ service文件夹。完成后,将LeaveEndpoint.java添加到以下文件夹中 - C:\ MVN \ leaveService \ src \ main \ java \ com \ codingdict \ hr \ ws文件夹。 pom.xml <?xml version = "1.0" encoding = "UTF-8"?> <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.codingdict.hr</groupId> <artifactId>leaveService</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>leaveService Spring-WS Application</name> <url>http://www.springframework.org/spring-ws</url> <build> <finalName>leaveService</finalName> </build> <dependencies> <dependency> <groupId>org.springframework.ws</groupId> <artifactId>spring-ws-core</artifactId> <version>2.4.0.RELEASE</version> </dependency> <dependency> <groupId>jdom</groupId> <artifactId>jdom</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> </dependencies> </project> HumanResourceService.java package com.codingdict.hr.service; import java.util.Date; public interface HumanResourceService { void bookLeave(Date startDate, Date endDate, String name); } HumanResourceServiceImpl.java package com.codingdict.hr.service; import java.util.Date; import org.springframework.stereotype.Service; @Service public class HumanResourceServiceImpl implements HumanResourceService { public void bookLeave(Date startDate, Date endDate, String name) { System.out.println("Booking holiday for [" + startDate + "-" + endDate + "] for [" + name + "] "); } } LeaveEndpoint.java package com.codingdict.hr.ws; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ws.server.endpoint.annotation.Endpoint; import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.springframework.ws.server.endpoint.annotation.RequestPayload; import com.codingdict.hr.service.HumanResourceService; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.Namespace; import org.jdom.xpath.XPath; @Endpoint public class LeaveEndpoint { private static final String NAMESPACE_URI = "http://codingdict.com/hr/schemas"; private XPath startDateExpression; private XPath endDateExpression; private XPath nameExpression; private HumanResourceService humanResourceService; @Autowired public LeaveEndpoint(HumanResourceService humanResourceService) throws JDOMException { this.humanResourceService = humanResourceService; Namespace namespace = Namespace.getNamespace("hr", NAMESPACE_URI); startDateExpression = XPath.newInstance("//hr:StartDate"); startDateExpression.addNamespace(namespace); endDateExpression = XPath.newInstance("//hr:EndDate"); endDateExpression.addNamespace(namespace); nameExpression = XPath.newInstance("concat(//hr:FirstName,' ',//hr:LastName)"); nameExpression.addNamespace(namespace); } @PayloadRoot(namespace = NAMESPACE_URI, localPart = "LeaveRequest") public void handleLeaveRequest(@RequestPayload Element leaveRequest) throws Exception { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date startDate = dateFormat.parse(startDateExpression.valueOf(leaveRequest)); Date endDate = dateFormat.parse(endDateExpression.valueOf(leaveRequest)); String name = nameExpression.valueOf(leaveRequest); humanResourceService.bookLeave(startDate, endDate, name); } } /WEB-INF/spring-ws-servlet.xml <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xmlns:sws = "http://www.springframework.org/schema/web-services" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package = "com.codingdict.hr"/> <bean id = "humanResourceService" class = "com.codingdict.hr.service.HumanResourceServiceImpl" /> <sws:annotation-driven/> <sws:dynamic-wsdl id = "leave" portTypeName = "HumanResource" locationUri = "/leaveService/" targetNamespace = "http://codingdict.com/hr/definitions"> <sws:xsd location = "/WEB-INF/hr.xsd"/> </sws:dynamic-wsdl> </beans> /WEB-INF/web.xml <web-app xmlns = "http://java.sun.com/xml/ns/j2ee" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version = "2.4"> <display-name>codingdict HR Leave Service</display-name> <servlet> <servlet-name>spring-ws</servlet-name> <servlet-class> org.springframework.ws.transport.http.MessageDispatcherServlet </servlet-class> <init-param> <param-name>transformWsdlLocations</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring-ws</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> /WEB-INF/hr.xsd <xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema" xmlns:hr = "http://codingdict.com/hr/schemas" elementFormDefault = "qualified" targetNamespace = "http://codingdict.com/hr/schemas"> <xs:element name = "LeaveRequest"> <xs:complexType> <xs:all> <xs:element name = "Leave" type = "hr:LeaveType"/> <xs:element name = "Employee" type = "hr:EmployeeType"/> </xs:all> </xs:complexType> </xs:element> <xs:complexType name = "LeaveType"> <xs:sequence> <xs:element name = "StartDate" type = "xs:date"/> <xs:element name = "EndDate" type = "xs:date"/> </xs:sequence> </xs:complexType> <xs:complexType name = "EmployeeType"> <xs:sequence> <xs:element name = "Number" type = "xs:integer"/> <xs:element name = "FirstName" type = "xs:string"/> <xs:element name = "LastName" type = "xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> 建立项目 现在让我们打开命令控制台,转到C:\MVN\leaveService目录并执行以下 mvn 命令。 C:\MVN\leaveService>mvn clean package Maven将开始构建该项目。 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building leaveService Spring-WS Application 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ leaveService --- [INFO] Deleting C:\mvn\leaveService\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ leaveServi ce --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ leaveService -- - [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b uild is platform dependent! [INFO] Compiling 3 source files to C:\mvn\leaveService\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ le aveService --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\mvn\leaveService\src\test\resource s [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ leaveSe rvice --- [INFO] No sources to compile [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ leaveService --- [INFO] No tests to run. [INFO] [INFO] --- maven-war-plugin:2.2:war (default-war) @ leaveService --- [INFO] Packaging webapp [INFO] Assembling webapp [leaveService] in [C:\mvn\leaveService\target\leaveServ ice] [INFO] Processing war project [INFO] Copying webapp resources [C:\mvn\leaveService\src\main\webapp] [INFO] Webapp assembled in [7159 msecs] [INFO] Building war: C:\mvn\leaveService\target\leaveService.war [INFO] WEB-INF\web.xml already added, skipping [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 19.667 s [INFO] Finished at: 2017-01-21T11:56:43+05:30 [INFO] Final Memory: 18M/173M [INFO] ------------------------------------------------------------------------ 在Eclipse中导入项目 按照下面给出的步骤在Eclipse中导入项目。 打开Eclipse。 选择 文件→导入→ 选项。 选择Maven项目选项。单击“下一步”按钮。 选择项目位置,其中使用Maven创建了 leaveService项目 。 单击完成按钮。 运行项目 完成创建源文件和配置文件后,导出应用程序。右键单击应用程序,使用Export→WAR File选项并将leaveService.war文件保存在Tomcat的webapps文件夹中。 启动Tomcat服务器并确保我们能够使用标准浏览器从webapps文件夹访问其他网页。尝试访问URL - http://localhost:8080/leaveService/leave.wsdl,如果Spring Web Application一切正常,我们应该看到以下屏幕。 Spring Web Services 环境设置 Spring Web Services 静态WSDL