使用wsimport生成JAX-WS客户端之后
wsimport -keep WebService.wsdl
JAX-WS为什么必须在运行时寻找wsdl位置?这是一个错误吗?
我发现了这篇很棒的文章:JAX-WS client : what's the correct path to access the local WSDL?
但是没有说为什么我们在运行时需要wsdl
这是错误吗?
不,这不是错误,但是从概念上讲是合理的。
JAX-WS为什么必须在运行时寻找wsdl位置?
[在构建时,您从WSDL生成类,这意味着您需要知道服务支持哪种类型的操作以及消息具有什么结构(aka portTypes
,types
,messages
)。
在运行时,许多不同的信息开始发挥作用。例如,服务运行的实际地址可能已更改。 bindings
变得相关:消息应该以SOAP 1.1或1.2发送还是两种格式都可以?此外,服务可能会附加各种策略(安全性,可靠的消息传递等)。所有这些都是动态的,并且在构建时几乎无关紧要。理想情况下,您应该能够将客户指向使用相同结构的其他服务,并且该服务应该开箱即用。
我想回答另一个我认为您可能有的问题:
如果只有一项永不更改的服务,这不是总开销吗?
是,是的。如果只有一个具有特定WSDL的服务,并且该服务永远不会从其构建时状态发生变化,则在运行时重新加载WSDL是不必要的,而且会浪费资源。但是,如果JAX-WS不允许出现诸如绑定或策略之类的信息确实发生更改或者服务的端点不止一个的更复杂场景,那么它将做得很糟糕。
尽管如此,大多数JAX-WS实现的确允许某种机制在本地存储WSDL,而不在运行时将其加载以进行调用。在RI中,只需将wsdlLocation
中的@WebServiceClient
指向类路径上的文件即可解决问题。
我认为,也许您需要一个代码解决方案。