1. 程式人生 > >基於spring框架的webservice介面的開發和除錯

基於spring框架的webservice介面的開發和除錯

1. 基本環境

tomcat6、spring、jdk1.7

2. 引入cxf的jar包

Spring框架整合webservice需要用到cxf框架,需要在pom.xml裡引入以下jar包

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.2.3</version>
</dependency
>
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>2.2.3</version> </dependency>

3. 在web.xml中配置CXFServlet

這裡的/services/*對應的路徑就是:http://localhost:8080/專案名/services

  <servlet>
    <servlet-name
>
CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>
/services/*</url-pattern> </servlet-mapping>

4. 在applicationContext.xml中配置endpoint

注意需要引入以下名稱空間,否則jaxws:endpoint無法識別
我們的最終訪問路徑是:http://localhost:8080/專案名/services/XXXService?wsdl

xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
            http://cxf.apache.org/jaxws
            http://cxf.apache.org/schemas/jaxws.xsd">

這裡的cxf*.xml檔案會自動引入,只要你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="pendServiceEndPoint" implementor="com.xxx.service.impl.XXXServiceImpl" address="/XXXService"></jaxws:endpoint> 

5. 編寫IXXXService介面

介面類需要寫@WebService
@WebParam表示在xml中顯示的名稱

@WebService
public interface IXXXService {

    @WebMethod
    public String getXXX(
            @WebParam(name="XXX1") String xxx1,
            @WebParam(name="XXX2") String xxx2);

6. 編寫XXXServiceImpl

@webservice加不加沒有問題
由於返回的是xml字串,所以使用了dom4j解析。
當然,你也可以返回一個物件。

@WebService
public class XXXServiceImpl implements IXXXService {

    @WebMethod
    @Override
    public String getXXX(
            @WebParam(name="XXX1") String xxx1,
            @WebParam(name="XXX2") String xxx2) {

        String result = null;

        // dom4j 拼接xml
        Document document = DocumentHelper.createDocument();
        Element rootElement = document.addElement("root");
        Element resultElement = rootElement.addElement("Result");
        resultElement.addCDATA("1");
        Element errorElement = rootElement.addElement("ErrorDescription");
        errorElement.addCDATA("發生了錯誤!");
        return formatXML(document);
    }

    /**
     * 格式化xml字串
     * @param document
     * @return
     */
    public String formatXML(Document document) {
        String result = null;
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("GBK");
        StringWriter writer = null;
        try {
            writer = new StringWriter();
            XMLWriter xmlWriter = new XMLWriter(writer, format);
            xmlWriter.write(document);
            xmlWriter.close();

            result = writer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }
}

7. 除錯

我使用兩種方式:1. SoapUI軟體除錯;2. Eclipse自動生成程式碼

7.1 SoapUI除錯(推薦)

首先官網下載SoapUI,安裝
新建一個SOAP,然後輸入訪問的地址

這裡寫圖片描述

然後看到左邊欄出現介面的方法,展開方法,雙擊請求,可以看到請求和響應的介面,改變輸入引數的值,點選執行,即可得到返回結果

  • 請求裡面的程式碼
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:util="http://utils.cbl/">
   <soapenv:Header/>
   <soapenv:Body>
      <util:getXXX>
         <!--Optional:-->
         <XXX1>?</XXX1>
         <!--Optional:-->
         <XXX2>?</XXX2>
      </util:getXXX>
   </soapenv:Body>
</soapenv:Envelope>
  • 響應裡面的程式碼
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getXXXResponse xmlns:ns2="http://service.pendingservice.gdcn.com/">
         <return>
         <!-- 裡面的內容是返回的xml -->
         </return>
      </ns2:getXXXResponse>
   </soap:Body>
</soap:Envelope>
7.2 Eclipse自動生成程式碼

eclipse新建一個java專案
右鍵 -> 新建 -> other -> web service client -> 輸入訪問地址
eclipse會自動幫我們生成一些程式碼
然後寫一個測試類

        String endPoint = "http://localhost:8080/專案名/services/XXXService?wsdl";
        URL endPointUrl = new URL(endPoint);
        XXXServiceImplServiceLocator service = new XXXServiceImplServiceLocator();
        XXXServiceImplServiceSoapBindingStub xxx = new XXXServiceImplServiceSoapBindingStub(endPointUrl, service);
        String result = xxx.getXXX("123","123");
        System.out.println(result);