我们有几个基于MS的web服务,可见为。asmx?内网的WSDL链接。当这个web服务与最新的Visual Studio一起使用时没有问题。所有业务对象都有意义。我怀疑微软在使用servicerreference时使用了一些秘密握手,并依赖于一些专有知识,即在元素类型为<s:schema>
但是我们部门需要使用所有Java。我选择的框架是CXF (v.2.4.2),它可以很好地与Eclipse、SOAP-UI、Tomcat一起工作。还有互操作性方面的问题。首先,每个wsdl都必须手工修改。都是<s:schema> <s:any> are replaced with single <s:any>
。在此之后CXF可以完成生成客户端Java。但是Java对象不是业务类型的pojo。它们是某种DOM元素,比如
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <any/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"any"
})
public static class GetDepartmentsResult {
@XmlAnyElement(lax = true)
protected Object any;
/**
* Gets the value of the any property.
*
* @return
* possible object is
* {@link Object }
*
*/
public Object getAny() {
return any;
}
/**
* Sets the value of the any property.
*
* @param value
* allowed object is
* {@link Object }
*
*/
public void setAny(Object value) {
this.any = value;
}
}
当代码在运行时测试时,一切正常。但是每个对象都必须被视为DOM元素。我确信我在删除<s:schema>
或使用wsld2java时犯了一个错误,所以它失去了语义。但是我应该在CXF中做些什么,才能使Java类看起来像CSharp类一样干净呢?
谢谢。
编辑:在http://msdn.microsoft.com/en-us/magazine/cc188755.aspx得到了一些线索,我希望这个链接将在以后的时间有效,当有人搜索相同的答案。查找文章的其他方法是:
MSDN杂志>问题> 2003>四月> XML文件:Web服务和数据集
答案:不可能
经过详尽的研究,很明显,当服务端没有Business CSharp对象时,Business pojo是不可能在客户端上重构的。那么简单。
在我的特殊情况下:
- CXF 2.4.2 wsdl2java消费ASMX ASP。. NET将返回s:schema error: FAIL 使用CXF 2.4.2的SOAPUI会因为同样的原因失败
- Oracle Sun Metro Glassfish 3.1导入使用ASMX ASP。. NET将需要模式的本地副本:PASS(但需要WSDL的本地副本,但仍然没有业务对象)
在未来,最好的场景是:
- Oracle Sun WSIT Tango使用Microsoft WCF服务,通过额外的"秘密握手"在消费期和运行期传递一些元信息。