为什么Java Client在运行时需要WSDL?

时间:2012-07-29 19:17:42

标签: java web-services java-ee

为Java WS客户端生成工件后,

  • 为什么需要wsdllocation引用?
  • 为什么运行时需要WSDL?

我可能会看到一些验证的原因,但不应该是可选的吗?

1 个答案:

答案 0 :(得分:5)

总结:从设计角度来看,Web服务客户端不需要WSDL,但Sun对Web服务客户端实施的实现对WSDL具有硬依赖性。明显的目的是动态生成一些运行时依赖项。


首先:如果您希望生成便携式客户端,那么打包WSDL并引用它是一种很好的做法。

现在,除此之外,如果实现生成了所有必需的运行时工件,则不需要WSDL。

对于Java,wsimport工具会生成一些静态工件(接口和可能支持代码以满足性能目标),并使其他元素在运行时动态创建。从一开始,我们就看到WSDL文档在Service构造函数中占据主要位置:

protected Service(java.net.URL wsdlDocumentLocation, QName serviceName)
    delegate = Provider.provider().createServiceDelegate(wsdlDocumentLocation,
                                                         serviceName,
                                                         this.getClass());
}

WSDL文档被解析为source数据流;如果没有提供,它默认为(自由提取核心本质):

  

source = new StreamSource(... webserviceclient.wsdlLocation()...);

并深入挖掘WSServiceDelegate:

WSDLModelImpl wsdlmodelimpl = parseWSDL(url, source);
wsdlserviceimpl = wsdlmodelimpl.getService(serviceName);

它正在动态创建至少部分底层服务支持。

wsdlLocation是Java实现的组成部分。