基於spring框架的webservice介面的開發和除錯
阿新 • • 發佈:2018-11-07
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);