【问题标题】:How to properly catch ClientTransportException如何正确捕获 ClientTransportException
【发布时间】:2016-03-10 12:57:17
【问题描述】:

我有一个用 JAX-WS 编写的 SOAP 客户端。 我的代码是这样的:

UpdateSub port = service.getUpdateSub();
port.soapMethod(parameter);

我想为与 SOAP 服务器的连接被拒绝或超时的情况提供特定的代码。 我测试了这些案例,发现soapMethod 抛出了ClientTransportException。 ClientTransportException 来自 sun 包,因此如果我导入它以捕获它,编译器会抛出此错误:

com.sun.xml.internal.ws.client 包不存在

我按照 karmakaze 建议的方式解决了这个问题 here

据我了解,这只是一种解决方法,Oracle 不建议这样做。 那么,没有编译器参数捕获这种异常的正确方法是什么?

【问题讨论】:

  • 你好。我仍然找不到使用 JAX-WS 处理 401 或 403 响应代码的简单方法...当 web 服务凭据无效时,我想提供一个专用异常。仍在寻找

标签: java web-services soap


【解决方案1】:

从我的角度来看,ClientTransportException 不是为了被捕获而设计的,应该使用 WebServiceException 来代替,但是 HTTP 状态代码不再可用。

我已经研究了如何处理 SOAP 1.2 故障,因为服务器使用 HTTP 401 状态代码回答了无效身份验证。根据SOAP 1.2 Adjuncts,这样的答案是完全有效的。

主要问题来自HttpTransportPipe::checkStatusCode,它阻止了 400 和 500 以外的状态代码被处理为 SOAP 错误,导致 ClientTransportException,我认为它应该只在不支持的状态代码缺少有效负载时抛出,我的意思是标准表 17 中列出的代码以外的代码。请参阅相关的 commit commentsoriginal issue in tracker

【讨论】:

  • 所以 JDK 中 SOAP 1.2 客户端的默认实现实际上无法处理服务器发送 401 UNAUTHORIZED 回复?尽管这是一个完全有效的回应?这看起来很疯狂!
  • 对,它也让我发疯了......这个答案很老,并且随着项目的移动而链接被破坏,所以我邀请你与最新的 Java 运行时 HttpTransportPipe::checkStatusCode 方法进行比较,但我猜没什么已更改有关 401 http 错误处理。
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多