本文主要介绍如何根据spring提供的spring-ws构建一个简单的webservice服务。
在开始之前,首先需要新建一个maven项目,这里不再赘述如何新建maven web项目。
1、配置pom文件
使用spring-ws构建webservice服务,需要依赖spring-ws-core,spring-core
<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.webservice</groupId>
<artifactId>service</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>service Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>4.3.2.RELEASE</spring.version>
<log4j2_version>2.5</log4j2_version>
<springws.version>2.4.0.RELEASE</springws.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- spring 依赖配置 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- webservice依赖配置 -->
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>${springws.version}</version>
</dependency>
<!-- log4j依赖配置 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2_version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2_version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2_version}</version>
</dependency>
</dependencies>
<build>
<finalName>service</finalName>
</build>
</project>
2、配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<!--Spring-WS配置文件的位置,默认寻找[servlet-name]-servlet.xml文件 -->
<!--<init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/spring-ws-config.xml</param-value>
</init-param> -->
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>*.wsdl</url-pattern>
</servlet-mapping>
</web-app>
3、配置ws文件
在WEB-INF文件夹下新建一个spring-ws-servlet.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:sws="http://www.springframework.org/schema/web-services"
xmlns:ws="http://www.springframework.org/schema/integration/ws"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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/web-services
http://www.springframework.org/schema/web-services/web-services-2.0.xsd">
<!-- 扫描指定包下的组件 -->
<context:component-scan base-package="service.ron" />
<!-- 引入wsdl文件 -->
<sws:static-wsdl location="/WEB-INF/wsdl/UserService.wsdl" />
</beans>
4、在WEB-INF下新建wsdl文件夹,新建UserService.wsdl文件并做如下配置
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost/namespace/userservice/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserService"
targetNamespace="http://localhost/namespace/userservice/">
<!-- 定义webservice使用的数据类型 -->
<wsdl:types>
<xsd:schema targetNamespace="http://localhost/namespace/userservice/">
<xsd:element name="login">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="username" type="xsd:string" />
<xsd:element name="password" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="loginResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="checkuser">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="userkey" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="checkuserResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<!-- 定义操作登录的数据元素 -->
<wsdl:message name="login">
<wsdl:part element="tns:login" name="parameters" />
</wsdl:message>
<wsdl:message name="loginResponse">
<wsdl:part element="tns:loginResponse" name="parameters" />
</wsdl:message>
<!-- 定义操作检查用户的数据元素 -->
<wsdl:message name="checkuser">
<wsdl:part element="tns:checkuser" name="parameters" />
</wsdl:message>
<wsdl:message name="checkuserResponse">
<wsdl:part element="tns:checkuserResponse" name="parameters" />
</wsdl:message>
<!-- 描述个提供的服务、可被执行的操作,以及相关的消息。 -->
<wsdl:portType name="IUserService">
<!-- 描述login服务 -->
<wsdl:operation name="login">
<wsdl:input message="tns:login" />
<wsdl:output message="tns:loginResponse" />
</wsdl:operation>
<!-- 描述checkuser服务 -->
<wsdl:operation name="checkuser">
<wsdl:input message="tns:checkuser" />
<wsdl:output message="tns:checkuserResponse" />
</wsdl:operation>
</wsdl:portType>
<!-- 为每个端口定义消息格式和协议细节。 -->
<wsdl:binding name="UserServiceSOAP" type="tns:IUserService">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="login">
<soap:operation soapAction="http://localhost:8080/service/UserService/login" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="checkuser">
<soap:operation soapAction="http://localhost:8080/service/UserService/checkuser" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="UserService">
<wsdl:port binding="tns:UserServiceSOAP" name="UserServiceSOAP">
<soap:address location="http://localhost:8080/service/UserService.wsdl" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
5、生成java文件
运行cmd命令 进入sdk的bin目录
输入命令:wsimport -keep -verbose -s '代码路径' 'wsdl文件路径'
新建包,并拷贝生成的文件到项目中,有些没用的可以删掉,清理之后的文件目录大致为:
6、编写userservice接口实现类
package service.ron.service;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;
import service.ron.api.IUserService;
/**
* @Comment
* @Author Ron
* @date 2017年1月9日 上午11:26:35
*/
@Component("userService")
public class UserServiceImpl implements IUserService {
private static final Logger logger = LogManager.getLogger(UserServiceImpl.class);
@Override
public String login(String username, String password) {
// TODO Auto-generated method stub
logger.info(username + "登录");
String out = "";
if (username.equals("ron") && password.equals("111")) {
out = "login success";
} else {
out = "login error";
}
logger.info(username + " " + out);
return out;
}
/**
* 检查用户
*/
@Override
public String checkuser(String userkey) {
return "00";
}
}
7、编写endpoint
生成的代码中没有endpoint,需要我们自己去写endpoint
package service.ron.endpoint;
import javax.annotation.Resource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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 org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import service.ron.api.IUserService;
import service.ron.entity.Checkuser;
import service.ron.entity.CheckuserResponse;
import service.ron.entity.Login;
import service.ron.entity.LoginResponse;
/**
* @Comment
* @Author Ron
* @date 2017年1月9日 上午11:32:37
*/
@Endpoint
public class UserServiceEndpoint {
private static final Logger logger = LogManager.getLogger(UserServiceEndpoint.class);
// UserService.wsdl声明的命名空间
public static final String USERVICE_NAMESPACE = "http://localhost/namespace/userservice/";
@Resource(name = "userService")
private IUserService userService;
@PayloadRoot(namespace = USERVICE_NAMESPACE, localPart = "login")
@ResponsePayload
public LoginResponse handleLoginRequest(@RequestPayload Login request) {
logger.info("Entered into handelLoginRequest method.");
String info = userService.login(request.getUsername(),request.getPassword());
LoginResponse response = new LoginResponse();
response.setOut(info);
logger.info("Exit from handelLoginRequest method.");
return response;
}
/**
* @Comment 处理检查用户信息
* @Author Ron
* @Date 2017年1月9日 下午4:43:46
* @param request
* @return
*/
@PayloadRoot(namespace = USERVICE_NAMESPACE, localPart = "checkuser")
@ResponsePayload
public CheckuserResponse handleCheckRequest(@RequestPayload Checkuser request) {
logger.info("Entered into handleCheckRequest method.");
String info = userService.checkuser(request.getUserkey());
CheckuserResponse response = new CheckuserResponse();
response.setOut(info);
logger.info("Exit from handleCheckRequest method.");
return response;
}
}
8、soapui测试结果
如果不知道soapui是啥或者不知道怎么用,百度一下就可以了。
源码下载:http://download.csdn.net/detail/zyhlwzy/9732973