服务器端的 GWT 违规检查引发 SerializationException

Posted

技术标签:

【中文标题】服务器端的 GWT 违规检查引发 SerializationException【英文标题】:GWT violation check on server side throws SerializationException 【发布时间】:2011-10-22 18:16:46 【问题描述】:

我遵循 gwt 2.4 验证示例并将所有内容实现到我自己的应用程序中。客户端工作得很好。

    private void verifyRegistrationData(final RegistrationTO registration) throws ConstraintViolationException 
        final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        final Set<ConstraintViolation<RegistrationTO>> violations = validator.validate(registration);

        if (violations.size() > 0) 
            final Set<ConstraintViolation<?>> temp = new HashSet<ConstraintViolation<?>>(violations);
            throw new ConstraintViolationException(temp);
        ...

但如果我在服务器端做同样的事情:

    public void update(final RegistrationTO registration) throws IllegalArgumentException, ConstraintViolationException, TestException 
    final Set<ConstraintViolation<RegistrationTO>> violations = validator.validate(registration);
    if (!violations.isEmpty()) 
        final Set<ConstraintViolation<?>> temp = new HashSet<ConstraintViolation<?>>(violations);
        throw new ConstraintViolationException(temp);
    
    ...

整个事情都崩溃了,但有以下异常: javax.servlet.ServletContext 日志:调度传入 RPC 调用时出现异常 com.google.gwt.user.client.rpc.SerializationException:类型 'org.hibernate.validator.engine.PathImpl' 未包含在可由此 SerializationPolicy 序列化的类型集中,或者无法加载其 Class 对象。出于安全考虑,此类型不会被序列化。

这就是 PathImpl 看起来像 hibernate-validator-4.1.0.Final-sources.jar 的样子

public class PathImpl implements Path, Serializable 
    private static final long serialVersionUID = 7564511574909882392L;
    ...

看起来不错(至少在我看来)

我正在使用 GWT 2.4、validation-api-1.0.0.GA、hibernate-validator-4.1.0.Final、gwt-servlet-deps ...

提前致谢!

【问题讨论】:

欢迎来到 GWT-RPC 的不确定世界。时机成熟时切换到 RequestFactory,这是一个建议。 【参考方案1】:

是否有明确定义的默认构造函数? IE。, public PathImpl() ?这是 GWT 的序列化机制所要求的;如果它不在源中,则序列化 RPC 响应将失败。

【讨论】:

嘘... - 不。默认构造函数是私有的。问题是 PathImpl 来自 hibernate-validation-4.1.0.Final.jar 然后你需要创建你自己的类来扩展hibernate PathImpl。那是你的问题。【参考方案2】:

PathImpl 确实存在自定义序列化程序,只是除非该类在您的服务 API 中明确引用,否则不会将其添加到序列化策略中。

当前的解决方法是在服务 API 的某处添加一个虚拟的 PathImpl 字段。 ValidationSupport 类的存在是为了将这个类和其他这样的类组合在一起,使这更容易一些。

【讨论】:

【参考方案3】:

我按照 Thomas Broyer 的建议将整个内容更改为 RequestFactory。到目前为止,它不像 GWT-RPC 那样容易。这就是我收集各种信息并构建示例程序的原因。 对于那些感兴趣的人 - here,您可以找到包含文档和源代码的示例。 (还实现了单行客户端记录器)(文档是德文的,但 logging-output aso. 是英文的......)

【讨论】:

以上是关于服务器端的 GWT 违规检查引发 SerializationException的主要内容,如果未能解决你的问题,请参考以下文章

gwt 应用程序客户端的会话管理

与 GWT 客户端和 ASP.NET C# 服务器端的通信/传输协议

来自客户端 java 端的 GWT 查询

如何在 GWT RPC 中将异常从服务器传递到客户端

尝试从二进制文件读取时引发违规

GWT验证i18n