使用wsimport生成JAX-WS客户端之后
wsimport -keep WebService.wsdl
Run Code Online (Sandbox Code Playgroud)
JAX-WS在运行时需要查找wsdl位置的原因是什么?
这是一个错误吗?
我找到了这篇伟大的帖子: JAX-WS客户端:访问本地WSDL的正确途径是什么?
但它没有说明为什么我们在运行时需要wsdl
这是一个错误吗?
不,这不是一个错误,但从概念的角度来看是合理的.
JAX-WS在运行时需要查找wsdl位置的原因是什么?
在构建时,你产生的,这意味着你需要知道什么样的业务的服务支持和消息有什么结构(又名WSDL类portTypes,types,messages).
在运行时,会发挥许多不同的信息.例如,服务运行的实际地址可能已更改.将bindings成为相关:如果消息在SOAP 1.1或1.2发送或者是这两种格式的好吗?此外,可以将各种策略(安全性,可靠消息传递等)附加到服务上.所有这些都是动态的,在构建时大多不相关.理想情况下,您应该能够将客户端指向使用相同结构的不同服务,并且它应该开箱即用.
我想回答一下我认为你可能会遇到的另一个问题:
如果只有一项服务永远不会改变,这不是一个总开销吗?
是的.如果单个服务具有永远不会从其构建时状态更改的特定WSDL,则在运行时重新加载WSDL是不必要的,并且浪费了资源.但是如果JAX-WS不允许更复杂的场景,例如绑定或策略确实发生变化,或者服务的端点不止一个,那么JAX-WS就会做得很糟糕.
尽管如此,大多数JAX-WS实现都允许某种机制在本地存储WSDL,而不是在运行时为调用加载它.在RI,只是指着wsdlLocation你@WebServiceClient对类路径中应该做的伎俩文件.