我正在尝试使用 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。