2

在我的 GWT 项目中,我为要在服务调用中抛出的异常链创建了一个精心设计,结果发现getCause()总是null在客户端的onFailure()方法中返回。

通过GWT序列化代码调试后,发现这段代码在SerializabilityUtil

private static boolean fieldQualifiesForSerialization(Field field) {
    if (Throwable.class == field.getDeclaringClass()) {
        /**
         * Only serialize Throwable's detailMessage field; all others are ignored.
         *
         * NOTE: Changing the set of fields that we serialize for Throwable will
         * necessitate a change to our JRE emulation's version of Throwable.
         */
        if ("detailMessage".equals(field.getName())) {
            assert (isNotStaticTransientOrFinal(field));
            return true;
        } else {
            return false;
        }
    } else {
        return isNotStaticTransientOrFinal(field);
    }
}

任何人都可以在这里帮助我,为什么 GWT 设计人员会将其放入他们的代码中?真的有什么问题(或安全敏感)Throwable.cause吗?

这被认为是理所当然的,我如何告诉 GWT 序列化为我的异常类创建一个异常?

4

1 回答 1

1

请注意代码中的注释,Changing the set of fields that we serialize for Throwable will necessitate a change to our JRE emulation's version of Throwable.这就是代码存在的原因,因为 Throwable 是 Java,而不是 Javascript,因此,任何被序列化以在客户端捕获的内容都必须与 GWT 的 JRE 类的 Javascript 实现兼容。查找GWT JRE 仿真参考以获取更多信息。

(请注意,他们可能试图更积极地在客户端实现 Throwable 子类,但即使他们这样做了,他们仍然无法确保出现某些第三方库的异常,并且这会破坏客户端反序列化。)

在我的项目中,我也有一个相当复杂的异常链。我所做的是确保在所有异常对象构造函数中保留消息,而不是原因。不幸的是,一些 Java 异常,容我们说,就它们的消息而言并不那么冗长,例如,与 C# 相反。例如,NullPointerException 有一个完全空的消息,而 ArrayIndexOutOfBoundsException 只是有一个数字。因此,我小心地将原因异常的名称嵌入到消息中的构造函数中。

它并不完美,但它有效。

于 2012-09-16T15:28:39.453 回答