1

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

给定以下带注释的 Web 界面代码。

网页界面:

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 被简单地列为复杂类型。因此,当我将 .Net4 服务引用指向 WSDL 时,生成的代码会将 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(我相信这称为数据契约)?

还是必须以另一种方式完成(通过以某种方式指定 KeyValuePair 的 XSD 文件?)

我在用着:

弹簧工具套件 2.9.2

CXF 2.6.1

.Net 4 通过 VS 2010。

4

1 回答 1

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 对象之前。

希望这些有所帮助。:)

于 2012-08-01T23:22:36.720 回答