【问题标题】:Throwing custom exceptions in JAX-WS在 JAX-WS 中抛出自定义异常
【发布时间】:2011-04-14 18:26:35
【问题描述】:

我有一个带有可能引发异常的 Web 方法的 JAX-WS Web 服务。

@WebMethod
public Folder getTree() throws UnauthorizedException {
    //...
    // Get authorization data..
    //...
    if (!authorized) {
        throw new UnauthorizedException();
    }
    //...
}

如果用户被授权,它可以正常工作,但是当抛出异常时,它不会生成带有错误的 SOAP 消息,它只会使 Web 服务崩溃

SEVERE: Unauthorized
    ru.cos.xdoc.storage.UnauthorizedException: Unauthorized
    at ru.cos.xdoc.storage.Storage.getTree(Storage.java:136)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

并关闭连接

HTTP/1.1 500 Internal Server Error
X-Powered-By: Servlet/2.5
Server: Sun GlassFish Enterprise Server v2.1.1
Content-Type: text/xml;charset="utf-8"
Transfer-Encoding: chunked
Date: Mon, 20 Sep 2010 15:43:59 GMT
Connection: close  

我觉得我错过了一些简单的事情

编辑 已证明该问题仅在 Web 方法开始后不久引发异常的情况下出现。在抛出异常之前引入延迟时,例如

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

throw new UnauthorizedException();

一切正常。

有没有人知道是什么导致了这种奇怪的行为?

【问题讨论】:

    标签: java jax-ws


    【解决方案1】:

    您是否将异常映射到故障?见JAX-WS - Map Exceptions to faults

    【讨论】:

    • 是的,我尝试使用不同类型的构造函数和其他方法将其映射到故障。它对我的情况没有影响。我认为问题在于容器甚至没有尝试从异常中创建故障,因为我没有收到诸如“类...未找到”之类的错误消息
    • UnauthorizedExceptionRuntimeException 的子类吗?如果是这种情况,可能 WS servlet 认为您的 WS 有错误。
    • 不,不是。它直接继承自Exception。
    【解决方案2】:

    也许仅仅构建一条消息告诉“权限被拒绝”或类似的东西会更简单。在我看来,Web 服务永远不应该抛出异常,它应该总是返回响应。

    【讨论】:

    • 问题是该方法应该返回文件夹树,这就是 Web 服务客户端应该期待的。当然有一个选项可以在 OUT 参数中传递错误消息,但我认为在这种情况下异常更适合。
    猜你喜欢
    • 2018-06-12
    • 2012-09-18
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多