为什么JAX-WS客户端在运行时访问WSDL?

use*_*026 7 wsdl jax-ws

使用wsimport生成JAX-WS客户端之后

wsimport -keep WebService.wsdl
Run Code Online (Sandbox Code Playgroud)

JAX-WS在运行时需要查找wsdl位置的原因是什么?
这是一个错误吗?

我找到了这篇伟大的帖子: JAX-WS客户端:访问本地WSDL的正确途径是什么?

但它没有说明为什么我们在运行时需要wsdl

joe*_*rgl 7

这是一个错误吗?

不,这不是一个错误,但从概念的角度来看是合理的.

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对类路径中应该做的伎俩文件.