曆史遺留項目,采用c#開發,原有的web service是.net的,現在想換成java版本的服務端,但是用戶端還是舊的.net用戶端,這就需要根據wsdl内容反向編寫java的web service端代碼,下面是這幾天折騰的結果。
java端的web service想基于cxf開發,使用cxf springboot start,建立項目過程比較簡單,關鍵點有maven的pom.xml檔案中引用
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.5.3</version>
</dependency>
再編寫一個cxf的自動配置類
package com.xxx.webservicedemo.config;
import com.xxx.webservicedemo.service.OrderWebService;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
@Configuration
@EnableAutoConfiguration
public class CxfConfig {
@Autowired
private Bus bus;
@Autowired
OrderWebService orderWebService;
/** JAX-WS
* 站點服務
* **/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, orderWebService);
endpoint.publish("/orderService");
return endpoint;
}
}
這就行了,剩下的就是編寫OrderWebService接口和實作類的事情了,這兩個用cxf去基于wsdl描述反向生成伺服器端代碼實作。
下載下傳完整的apache cxf壓縮包,配置CXF_HOME和path環境變量。
把.net開發的web service的WSDL描述xml檔案存到用戶端本地,因為需要修改裡面的内容,不修改的話會報錯:
WSDLToJava Error: file:/xxx.xml: undefined simple or complex type 'soapenc:Array'
這個undefined simple or complex type 'soapenc:Array' 報錯是因為.net的web service協定版本太舊且不标準造成的,解決辦法是下載下傳一個 https://schemasxmlsoap.azurewebsites.net/soap/encoding/
檔案,儲存到用戶端本地和.net的web service描述xml檔案放在同一個目錄,如取名為encoding.xsd,然後去修改web service接口描述xml文檔内容,找到
<s:schema targetNamespace="http://www.tsxd.com.cn/AbstractTypes">
<s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<s:complexType name="StringArray">
<s:complexContent mixed="false">
<s:restriction base="soapenc:Array">
改成
<s:schema targetNamespace="http://www.tsxd.com.cn/AbstractTypes">
<s:import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="encoding.xsd"/>
<s:complexType name="StringArray">
<s:complexContent mixed="false">
<s:restriction base="soapenc:Array">
然後執行wsdl2java.bat -p com.xxx.webservice -d d:\temp\ -server -impl -autoNameResolution service1.xml
然後還會報幾個沖突錯誤,出現這種情況時打開encoding.xsd檔案,根據提示修改對應的行,一般都是什麼int,string,bool之類的類型定義沖突了,注釋掉就可以了,例如:
<!-- <xs:element name="string" type="tns:string" /> -->
<xs:complexType name="string" >