在做其他事情之前,我想让你知道我已经可以连接到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
通过上面的类,我可以看出com.datamodel.xsd
包含Web服务服务器使用的bean(不包括ObjectFactory
和Packum-info
)。同时,Mymethod
和Mymetod响应
也是用于设置Web服务方法/操作的请求和响应参数的bean。
以下是我的问题:(如果你不知道我的一些问题的答案,你不必全部回答。)请随时分享你认为我可能有用的任何信息。)
我说的对吗
MyWebService
,它包含一个注释,引用了我用来生成客户端的WSDL的绝对位置。在客户端中指定wsdlplace
的相关性是什么?客户端如何使用该信息?wsimport
命令有一个 wsdlplace
属性,其中的值 wsdlplace
可以指定。(
你问:我注意到Web服务的实际URL没有在生成的任何类中声明。客户端如何知道它需要连接到哪里?
如果WSDL是使用浏览器下载的,并作为输入传递到wsimport,那么本地wsdl文件位置将嵌入到生成的代码中。这就是为什么您在生成的代码中看不到实际的服务位置。这也意味着如果您删除了wsdl文件的本地副本,生成的代码将无法工作(当使用主方法inovked时)。
如果将wsdl的URL作为输入传递给wsimport,那么该URL将嵌入生成的代码中,并进一步用于获取实际的服务位置。其思想是WSDL位置是固定的。它们应该位于UDDI中或作为本地文件。这允许实际的服务四处移动,如果它们确实移动了,您只需单独修改wsdl文件的本地副本,或者在UDDI中更新wsdl。[通常情况下,这不会发生,因为服务位置永远不是IP,而是DNS名称]
这就是为什么在运行Web服务的同一台服务器上发布wsdl从来都不是一个好主意
在我回答这些问题之前,先做一些澄清:JAX-WS是Java中实现Web服务的规范。它描述了如何将WSDL工件映射到Java类,以及如何使用注释应用这种映射。您可以在这里下载规范。工具wsimport是本规范参考实现的一部分,参考实现是Java类库的一部分。有几种替代实现,如Axis2、CXF或Metro,它们通过支持额外的标准(如WS-RelableMessage或WS-Security)来增强基本的JAX-WS支持。
现在到你的问题:
我以上的假设正确吗?
是的,你是。
其他类的功能是什么?
包信息
用于将web服务中使用的XML命名空间映射到实现类所在的包。名称空间通常与Java包名称(通常是URL)不同,这就需要进行映射。
ObjectFactory允许您创建服务发送和接收的任何消息。如果您想在存根类前面插入代码,提供修改后的消息或类似的东西,您需要这个。
我看不到您的类的内容,但如果我理解正确的话,MyWebServicePortType
是一个类似于WSDL中的portType
的接口。也就是说,它将WSDL中的操作及其签名映射到Java方法。如果你想提供服务(你没有,你是在询问客户),你需要实现这个接口。在实现客户机时,只需使用它。
最后,类MyWebService
包含要调用Web服务时所需的客户端存根。
我检查了MyWebService,它包含一个注释,指向我用来生成客户机的WSDL的绝对位置。在客户机中指定wsdllocation的相关性是什么?客户如何使用这些信息?
您生成的接口包含服务的portType
的签名,但它没有解释如何与服务对话。这是WSDL中绑定的一部分。最基本的设置是使用SOAP over HTTP的消息的文档/文字样式。其他配置,如SOAP over JMS,也是可能的,您的客户机需要知道要使用什么协议。因此,它需要绑定WSDL。此外,正如您稍后所说,Java文件中没有endpoint地址。这个地址也是从WSDL读取的。
我注意到,在生成的任何类中都没有声明web服务的实际URL。客户如何知道需要连接到哪里?
它从WSDL中服务
的端口
读取地址
。它位于WSDL的末尾。
是否注释了WSDL文件,以便客户端可以在连接时读取WSDL文件上的URL?
不,port
是具体Web服务endpoint的典型元素。这里不需要什么特殊的东西。
如果是这样,那么这是否意味着在必须建立新连接时总是读取WSDL文件?
嗯,客户端可能有缓存(我不知道这一个的参考实现的细节)。从概念的角度来看:是的。
如果我需要连接到HTTPS怎么办。如何设置服务器证书
这可能很棘手,我不能给你一个现成的答案。我建议大家通读关于这个话题的问题,比如这个。
当我使用wsimport生成我的客户端时和使用Axis2或Apache CXF生成它时有什么区别吗
是的,有。wsimport更好,不要使用wsdl2java。下面是一个描述,为什么。
问题内容: 首先,我希望您知道我已经可以连接到Web服务服务器。我问这个问题是因为我想对wsimport生成的客户端如何工作有更深入的了解。根据我的研究,wsimport使用JAXWS。请注意,我对JAXWS不了解。 我使用wsimport生成了客户端。我使用的WSDL来自Axis2 Web服务,并由Axis2自动生成。下面的类是wsimport的结果: 下 下 通过上面的类,我可以确定其中包含W
问题内容: 我正在尝试为访问WSDL描述的Web服务的Java应用程序编写模块。WSDL源代码直接从我认为是ASP.NET Web服务的地方下载;服务URL以.asmx扩展名结尾,在浏览器中查看服务URL会显示一个链接,该链接可用于下载WSDL。 对我来说,一个关键要求是能够切换服务URL而无需重新编译。给我的URL显然是一个测试服务器,而且我知道在生产环境中,我将获得要使用的生产URL。我还希望
我尝试通过wsimport命令生成此命令。下面是我使用的命令。 wsimport-keep-b bindings.xml-p com.aasc.carrier.shipexec.proxy-implserviceName wcfSoxContract-importname wcfShip http://shipexec.com/demo/wcf/soap?wsdl-b-xautonameresol
我可能在尝试做一些奇怪的事情,因为这似乎不是一个常见的问题(或者可能我问错了)。我原以为这会很简单。 基本上,我正在寻找的是一种方法,除了通过使用gradle openapi生成器插件: 我所尝试的是以下(以及相关的错误): 输入pec.set(www.example.com/openapi-doc) 实际代码如下所示:
我是stackoverflow的新手,因此这是我的第一篇文章。请原谅我英语不好。。。我花了几个小时在相关的话题上,但没有一个能满足我的需要。我正在编写一个通讯簿,我希望我的用户能够随时下载pdf联系人列表。一切似乎都很顺利,但实际上客户端从未下载pdf文件,尽管我可以在使用chrome开发者工具的请求中看到它。这是我的密码: 当检查响应时,我得到如下结果: 有没有人好心告诉我出了什么事?
问题内容: 我正在尝试使用JDK 6工具为某些SOAP Web服务生成客户端。WSDL由.NET 2.0应用程序生成。对于.NET 3.X应用程序,它可以正常工作。 当我跑步 它显示了一些错误消息,如下所示: [错误]具有相同名称“ mypackage.SomeClass”的类/接口已在使用中。使用类自定义解决此冲突。行?? 的HTTP://为MyService WSDL 当我使用Axis 1.4