2012-08-01 98 views
1

我正在嘗試使用cxf創建Java Spring Web服務。我正在採取(自下而上)採用Java合約並註釋代碼來生成Web服務的方法。Java/Spring Jax-ws在WSDL中公開了.Net的複雜類型

鑑於以下帶註釋的Web界面代碼。

WebInterface:

package org.webservice; 
import java.util.ArrayList; 
import java.util.Calendar; 
import javax.jws.WebMethod; 

@WebService 
public interface WebInterfaceI { 
    @WebMethod(operationName = "writeXML") 
    public String writeStuff(String objectType, String payloadXML, 
          String callerInfo, String options); 
@WebMethod(operationName = "XML") 
    public ArrayList<String> readStuff(KeyValuePair Data, Calendar asOfDate, 
             KeyValuePair options); 
} 

writeStuff()函數在WSDL就好露出。

readStuff()方法傳遞一個名爲KeyValuePair的複雜類型(不是我知道的一個好名字)。這些都是在一個單獨的文件中定義的(儘管我也試圖使它成爲一個本地類)。

package org.webservice; 
import java.io.Serializable; 
import java.util.List; 
import javax.jws.WebService; 

public class KeyValuePair implements Serializable {  
    private static final long serialVersionUID = 1L; 
    KeyValuePair() { 
     myValues = null; 
     myKeys = null; 
    } 
    KeyValuePair(List<String> keys, List<String> values) { 
     myValues = values; 
     myKeys = keys; 
    } 
    List<String> myValues; 
    List<String> myKeys; 
} 

但在WSDL中的KeyValuePair被簡單地列爲複雜類型:

KeyValuePair類。所以,當我在WSDL中指向一個.Net4服務引用時,生成的代碼會將KeyValuePair視爲一個對象。

生成.Net客戶端代碼:

public partial class keyValuePair: object, System.ComponentModel.INotifyPropertyChanged { 
     public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
     protected void RaisePropertyChanged(string propertyName) { 
      System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
      if((propertyChanged != null)) { 
       propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

的KeyValuePair的成員不被暴露,所以它不是可以填充一個在客戶端上。

所以問題是:

是什麼,我想真正做可能嗎?

是否有一種簡單的方法通過使用註釋通過WSDL公開KeyVlauePair(我認爲稱爲數據協定)?

或者它habve做的另一種方式(通過指定XSD文件莫名其妙的KeyValuePair?)

我使用:

春天工具套件2.9.2

CXF 2.6.1

通過VS

.NET 4的2010

回答

1

@DUFF喜也許這你不被填充KeyValuePair對象轉換成Web服務,你可以嘗試這樣的事情上KeyValuePair類,

public class KeyValuePair implements Serializable { 
    private static final long serialVersionUID = 1L; 
    List<String> myValues; 
    List<String> myKeys; 

    public KeyValuePair(List<String> keys, List<String> values) { 
     this.myKeys = keys; 
     this.myValues = values; 
    } 

    public List<String> getMyValues() { 
     return myValues; 
    } 

    public void setMyValues(List<String> myValues) { 
     this.myValues = myValues; 
    } 

    public List<String> getMyKeys() { 
     return myKeys; 
    } 

    public void setMyKeys(List<String> myKeys) { 
     this.myKeys = myKeys; 
    } 
} 

而在此之前,你可以填充KeyValuePair對象暴露的WSDL文件。

希望這些幫助。 :)

+0

謝謝,它最終如此簡單。我犯這樣一個基本的錯誤讓我感到羞愧。 – DUFF 2012-08-03 06:01:08