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

时间:2011-10-22 18:16:46

标签: validation gwt

我按照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 log:调度传入的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 ......

提前致谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

目前的解决方法是在服务API的某处添加一个虚拟PathImpl字段。 ValidationSupport类存在于将此类和其他类别组合在一起以使其更容易。

答案 2 :(得分:0)

我将整个事情改为RequestFactory,正如Thomas Broyer所推荐的那样。到目前为止,它并不像GWT-RPC那么容易。这就是我收集所有信息并构建示例程序的原因。

对于那些感兴趣的人 - here,您可以找到包含文档和来源的样本。 (也实现了单行客户端记录器)(文档是德语,但是日志输出aso。是英文...)