服务器端的 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 然后你需要创建你自己的类来扩展hibernatePathImpl
。那是你的问题。【参考方案2】:
PathImpl
确实存在自定义序列化程序,只是除非该类在您的服务 API 中明确引用,否则不会将其添加到序列化策略中。
当前的解决方法是在服务 API 的某处添加一个虚拟的 PathImpl
字段。 ValidationSupport
类的存在是为了将这个类和其他这样的类组合在一起,使这更容易一些。
【讨论】:
【参考方案3】:我按照 Thomas Broyer 的建议将整个内容更改为 RequestFactory。到目前为止,它不像 GWT-RPC 那样容易。这就是我收集各种信息并构建示例程序的原因。 对于那些感兴趣的人 - here,您可以找到包含文档和源代码的示例。 (还实现了单行客户端记录器)(文档是德文的,但 logging-output aso. 是英文的......)
【讨论】:
以上是关于服务器端的 GWT 违规检查引发 SerializationException的主要内容,如果未能解决你的问题,请参考以下文章