Java / Spring Jax-ws在.Net的WSDL中公开复杂类型

时间:2012-08-01 18:56:04

标签: web-services jax-ws

我正在尝试使用cxf创建Java spring Web服务。我采用(自下而上)方法获取Java合同并注释代码以生成Web服务。

给出以下带注释的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的复杂类型(我不知道这个名字)。这些是在一个单独的文件中定义的(虽然我也试图使它成为一个本地类)。

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被简单地列为复杂类型。因此,当我在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(我认为称为数据合约)的简单方法?

或者它是否有办法以另一种方式(通过以某种方式指定一个XSD文件KeyValuePair?)

我正在使用:

Spring tools suite 2.9.2

cxf 2.6.1

.Net 4来自VS 2010。

1 个答案:

答案 0 :(得分: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;
    }
}

之前,您可以为暴露的WSDL文件填充KeyValuePair对象。

希望这些有帮助。:)