在其他任何事情之前,我想让您知道我已经可以连接到Web服务服务器了。我问这个问题是因为我希望深入了解wsimport生成的客户端是如何工作的。根据我的研究,wsimport使用JAXWS。请注意,我不了解JAXWS。
我使用wsimport生成了我的客户端。我使用的WSDL来自Axis2 Web服务,由Axis2自动生成。下面的类是wsimport的结果:
在com.datamodel.xsd
下
DataBeanRequest.java
DataBeanResponse.java
ObjectFactory.java
package-info.java
在com.service
下
MyWebService.java
MyWebServicePortType.java
MyMethod.java
MyMethodResponse.java
ObjectFactory.java
package-info.java
使用上面的类,我可以告诉com.datamodel.xsd
包含Web服务服务器使用的bean(ObjectFactory
和package-info
除外)。同时,MyMethod
和MyMethodResponse
也是用于设置Web服务方法/操作的请求和响应参数的bean。
以下是我的问题:(如果你不知道我的一些问题的答案,你真的不必回答所有问题。:)请随时分享你认为我可能会找到的任何信息是有用的。)
我是否正确
MyWebService
,它包含一个注释,指的是我用来生成客户端的WSDL的绝对位置。在客户端中指定wsdllocation
的相关性是什么?客户如何使用该信息?wsimport
命令具有wsdllocation
属性,其中可以指定wsdllocation
的值。)答案 0 :(得分:45)
在回答问题之前,请先澄清一下:JAX-WS是用Java实现Web服务的规范。它描述了如何将WSDL工件映射到Java类以及如何使用注释应用此映射。你可以download the specification here。工具wsimport是本规范的参考实现的一部分,参考实现是Java类库的一部分。有几种替代实现,例如Axis2,CXF或Metro,它们通过支持其他标准(如WS-ReliableMessaging或WS-Security)来增强基本的JAX-WS支持。
现在回答你的问题:
我的上述假设是否正确?
是的,你是。
其他课程的功能是什么?
package-info
的存在是为了将Web服务中使用的XML命名空间映射到实现类所在的包。命名空间通常看起来与Java包名称不同(通常是URL),这使映射成为必要。
ObjectFactory
允许您创建服务发送和接收的任何消息。如果要在存根类前面挂钩代码,提供修改后的消息或类似的东西,则需要这样做。
我无法看到您的类的内容,但如果我理解它,MyWebServicePortType
是一个类似于WSDL中portType
的接口。也就是说,它将WSDL中的操作及其签名映射到Java方法。如果您想提供服务(您不需要提供服务,请询问客户端),您需要实现此接口。在您实现客户端时,您只需使用它。
最后,如果要调用Web服务,类MyWebService
包含您需要的客户端存根。
我检查了MyWebService,它包含一个引用的注释 我用来生成客户端的WSDL的绝对位置。什么 是在客户端中指定wsdllocation的相关性?怎么样 客户端是否使用该信息?
您生成的界面包含服务的portType
的签名,但它没有解释您如何与服务进行通信。这是WSDL中绑定的一部分。最基本的设置是使用SOAP over HTTP的消息的文档/文字样式。其他配置(例如SOAP over JMS)是可能的,您的客户端需要知道要使用的协议。因此它需要绑定WSDL。此外,正如您稍后所述,Java文件中没有端点地址。此地址也是从WSDL中读取的。
我注意到Web服务的实际URL未在中声明 生成的任何类。客户如何知道它需要什么 连接到?
它从WSDL中address
的{{1}}读取port
。这位于WSDL的末尾。
是否对WSDL文件进行了注释,以便客户端可以读取该URL上的URL 连接时的WSDL文件?
不,service
是具体Web服务端点的典型元素。这里没有什么特别的。
如果是这样,那么它是否意味着在新的时候总是读取WSDL文件 必须建立联系?
嗯,客户端可能有缓存(我不知道这个参考实现的细节)。从概念的角度来看:是的,它是。
如果我需要连接到HTTPS,该怎么办?我该如何设置服务器 证书
这可能很棘手,我不能给你一个开箱即用的答案。我建议您阅读有关此主题的问题such as this one。
使用wsimport生成客户端时有什么不同吗? 当我使用Axis2或Apache CXF
生成它时
是的,有。 wsimport更好,不要使用wsdl2java。 Here is a description, why
答案 1 :(得分:3)
您问:我注意到Web服务的实际URL未在生成的任何类中声明。客户如何知道需要连接的位置?
如果使用浏览器下载WSDL并将其作为输入传递给 wsimport ,则本地wsdl文件位置将嵌入到生成的代码中。这就是您在生成的代码中看不到实际服务位置的原因。这也意味着如果删除了wsdl文件的本地副本,则生成的代码将无法工作(使用main方法进行inovked时)。
如果将wsdl的URL作为输入传递给 wsimport ,则该URL嵌入在生成的代码中,该代码还用于获取实际的服务位置。我们的想法是WSDL位置是固定的。它们应该在UDDI中或作为本地文件。这允许实际服务移动,如果它们移动,您只需要单独修改wsdl文件的本地副本或更新UDDI中的wsdl。 [主要是这不会发生,因为服务地点永远不是IP而是DNS名称]
这就是为什么在运行webservice的同一服务器上发布wsdl永远不是一个好主意