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

时间:2013-07-09 15:46:21

标签: binding jax-ws stub

在编写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);

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

BindingProvider bp = (BindingProvider) stub;

1 个答案:

答案 0 :(得分:5)

BindingProvider bp = (BindingProvider) stub;

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

J j = (J) K;

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

InputStream in = System.in;
Runnable r = (Runnable) in;

上面的代码段编译是因为InputStreamRunnable都是非参数化接口,但在运行时会产生ClassCastException

ServiceInterfaceBindingProvider的强制转换有效,因为getPort返回一个实现WSBindingProvider接口的动态代理类,后者又扩展了BindingProvider接口