最近研究了一下spring webservice整合,由于第一次做這個,整合期間遇到了不少問題,在網上查找了好久也沒找到完整實作的server和client的demo,有的問題折騰了我好幾天,看到spring的官網裡面有人提相同的問題,但是都沒人給出解決方案,是以就隻能慢慢摸索,經過艱辛的探索,終于實作了一個完整的demo,在這裡我整理了一下分享給大家,希望能幫助大家解決這方面遇到的問題,由于在下才疏學淺,有的地方可能寫得不是很合理,希望大家提出來探讨一下,互相提高。我會盡量把自己遇到的問題展現出來,然後一一解決,廢話不多說,開始幹活:
第一部分實作spring webservice服務端的開發與部署。
1. 建立一個maven的web項目,完成一些準備工作。
1.1 在pom.xml中加入相關jar包,如下:
[html] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- <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.zdsoft.webservice</groupId>
- <artifactId>spring-webservice-server</artifactId>
- <packaging>war</packaging>
- <version>0.0.1-SNAPSHOT</version>
- <name>spring-webservice-server Maven Webapp</name>
- <url>http://maven.apache.org</url>
- <dependencies>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-ws-core</artifactId>
- <version>2.1.4.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- </dependencies>
- <build>
- <finalName>spring-webservice-server</finalName>
- </build>
- </project>
1.2 建立log4j.xml檔案,配置log4j列印資訊,如下:
[html] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out" />
- <param name="Threshold" value="ALL" />
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{HH:mm:ss:SSS} %p %l>> %m%n" />
- </layout>
- </appender>
- <root>
- <priority value="ALL" />
- <appender-ref ref="console" />
- </root>
- </log4j:configuration>
1.3 為了能讓我們的webservice能和web的容器內建到一起,需要在web.xml裡面做一些配置,如下:
[html] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- <!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
- @Component("userService")
- public class UserServiceImpl implements IUserService {
- private static final Logger LOG = LogManager.getLogger(UserServiceImpl.class);
- public String login(String username, String password) {
- LOG.info("Entered into UserServiceImpl method.");
- LOG.debug("username:" + username);
- LOG.debug("password:" + password);
- String info = "login failed.";
- if("scott".equals(username) && "tiger".equals(password)) {
- info = "login success.";
- }
- LOG.debug(info);
- LOG.info("Exit from UserServiceImpl method.");
- return info;
- }
- public User getUser(String username) {
- LOG.info("Entered into getUser method.");
- LOG.debug(username);
- User user = new User();
- user.setNickname(username + "--nickname");
- user.setPassword(username + "--password");
- user.setUsername(username + "--username");
- LOG.info("Exit from getUser method.");
- return user;
- }
- }
2.6 建立endpoint類:UserServiceEndpoint,如下:
[java] view plain copy
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5Gcu82Yp9VRE90Qvw1c0V2czF2LcRXZu5ibkN3YuUGZvN2Lc9CX6MHc0RHaiojIsJye.png)
- package com.zdsoft.webservice.endpoint;
- import javax.annotation.Resource;
- import org.apache.log4j.LogManager;
- import org.apache.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 com.zdsoft.webservice.api.user.GetUser;
- import com.zdsoft.webservice.api.user.GetUserResponse;
- import com.zdsoft.webservice.api.user.IUserService;
- import com.zdsoft.webservice.api.user.Login;
- import com.zdsoft.webservice.api.user.LoginResponse;
- import com.zdsoft.webservice.api.user.User;
- @Endpoint
- public class UserServiceEndpoint {
- private static final Logger LOG = LogManager.getLogger(UserServiceEndpoint.class);
- //UserService.wsdl聲明的命名空間
- public static final String USERVICE_NAMESPACE = "http://webservice.zdsoft.com/namespace/userservice";
- @Resource(name="userService")
- private IUserService userService;
- @PayloadRoot(namespace = USERVICE_NAMESPACE, localPart = "login")
- @ResponsePayload
- public LoginResponse handelLoginRequest(@RequestPayload Login request) {
- LOG.info("Entered into handelLoginRequest method.");
- String info = userService.login(request.getUsername(), request.getPassword());
- LoginResponse response = new LoginResponse();
- response.setInfo(info);
- LOG.info("Exit from handelLoginRequest method.");
- return response;
- }
- @PayloadRoot(namespace = USERVICE_NAMESPACE, localPart = "getUser")
- @ResponsePayload
- public GetUserResponse HandelGetUserRequest(@RequestPayload GetUser request) {
- LOG.info("Entered into HandelGetUserRequest method.");
- User user = userService.getUser(request.getUsername());
- GetUserResponse response = new GetUserResponse();
- response.setUser(user);
- LOG.info("Exit from HandelGetUserRequest method.");
- return response;
- }
- }
2.7 使用SoapUI工具測試
a. 下載下傳SoapUI,官網:http://www.soapui.org/, 這個工具使用方法去Google一下。
b. 測試我們的login方法,如下:
c. 測試我們的getUser方法, 如下: