JAX WSclient将存根转换为绑定提供者

Vic*_*tor 1 binding stub jax-ws

在编写JAXWS客户端时,这是我过去使用的:

// CALL SERVICE
EPaymentsService bPayService = new EPaymentsService();
ServiceInterface stub = bPayService.getPort();
BindingProvider bp = (BindingProvider) stub;
Map<String, Object> rc = bp.getRequestContext();
String endPointUrl = propFile.getString(Constants.END_POINT_URL);
rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endPointUrl);
// RESPONSE
ResponseMessage resMessage = stub.sendMessage(reqMessage);
Run Code Online (Sandbox Code Playgroud)

在我的代码中,ServiceInterface不会扩展BindingProvider.So为什么我们在转换时不会出错

BindingProvider bp = (BindingProvider) stub;
Run Code Online (Sandbox Code Playgroud)

c.P*_*.u1 5

BindingProvider bp = (BindingProvider) stub;
Run Code Online (Sandbox Code Playgroud)

这是一个缩小的参考转换.根据Narrowing引用转换的规则之一,K可以将接口类型分配给非参数化的接口类型J,前提K是不是子类型J(如果K是子类型,则不需要显式转换J) .

J j = (J) K;
Run Code Online (Sandbox Code Playgroud)

如果转换失败,则在运行时抛出ClassCastException.

InputStream in = System.in;
Runnable r = (Runnable) in;
Run Code Online (Sandbox Code Playgroud)

上面的代码编译,因为这两个InputStreamRunnable的非参数的接口,但会导致ClassCastException在运行时.

从构建ServiceInterfaceBindingProvider工作因为getPort返回实现WSBindingProvider接口的动态代理类,而后者又扩展了BindingProvider接口.