webMethods获取ServiceException的根本原因

时间:2015-09-14 09:11:42

标签: java exception http-status-code-401 webmethods

调用http服务时出现以下异常:

com.wm.app.b2b.server.ServiceException
Message: com.wm.net.NetException: [ISC.0064.9314] Authorization Required: Unauthorized

到目前为止,这么好。但我想以编程方式获取该信息 - 而不是人类可读的翻译。 我似乎没有机会获得状态代码401或100%证明问题是401的东西。

编写一个试图获取"根本原因的包装器" (getCause ...)不起作用。没有其他"原因" ...

我所有的都是可解析的字符串。有什么想法吗?

更新

我找到了一种方法来完成它 - 使用弃用的方法......:

...
try {
    output =
        Service.doInvoke( "my.package.authentication", "checkAuthentication", input );
} catch( final ServiceException sEx ) {

    // if this is deprecated: how to we have to handle this in future?
    final Throwable wrappedEx = sEx.getWrappedException();

    // return early
    if(null == wrappedEx || !NetException.class.isInstance(wrappedEx) ) {
        throw sEx;
    }

    // process the net exception
    final NetException nEx = (NetException)wrappedEx;
    final String responseBody = convertStreamToString(nEx.getResponseInputStream());

    // process the returned body wrapped by the net exception
    final Gson gson = new Gson();
    final ErrorData errorData = gson.fromJson(responseBody, ErrorData.class);

    // check if the problem is an invalid token
    tokenIsInvalid = errorData.code.equals(INVALID_TOKEN_EXCEPTION__CODE_STRING);

} catch( Exception e ) {
    // wrap the exception in a service exception and throw it
    throw new ServiceException(e);
}
...

更好的解决方案只需检查HTTP状态代码 - 但如果由http服务收到,则401将永远消失......: - |

1 个答案:

答案 0 :(得分:1)

通常,这种错误是由于您的Web服务上错误设置的执行ACL(假设您的http服务实际上是SOAP Web服务)。

使用webMethods Designer 9.2,

  1. 打开您的网络服务描述符
  2. 在属性中,单击“权限”
  3. 将“执行ACL”设置为“Anynomous”
  4. 如果你所展示的实际上是一个REST Web服务,那么这个过程几乎是一样的。 “权限”属性将在您的流服务的属性中。

    希望这有帮助