【问题标题】:Why doesn't GWT serialize an exceptions's cause chain?为什么 GET 不序列化异常原因链?
【发布时间】:2012-09-09 00:11:59
【问题描述】:

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

通过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 序列化为我的异常类创建一个异常?

【问题讨论】:

    标签: java gwt exception serialization


    【解决方案1】:

    注意代码中的 cmets 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 的 Javascript 实现兼容JRE 类。查看GWT JRE Emulation Reference了解更多信息。

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

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

    它并不完美,但它确实有效。

    【讨论】:

    • 我会说,这不会破坏客户端代码。因为 Throwable 子类的声明字段已经序列化,所以 GWT 只会忽略 Throwable 本身中声明的字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2011-01-20
    • 2012-09-04
    • 1970-01-01
    • 2012-02-26
    • 2018-11-19
    相关资源
    最近更新 更多