2011-10-22 25 views
0

我跟着gwt 2.4驗證示例,並實現了整個東西到我自己的應用程序。客戶端很好。服務器端的GWT違規檢查拋出SerializationException

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看起來像休眠 - 驗證 - 4.1.0.Final-sources.jar

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

看起來不錯(至少對我來說)

我使用GWT 2.4,驗證的API -1.0.0.GA,hibernate-validator-4.1.0.Final,gwt-servlet-deps ...

在此先感謝!

+1

歡迎來到不確定的GWT-RPC世界。當它仍然是時間時切換到RequestFactory,這是一個建議。 –

回答

2

是否有顯式定義的默認構造函數?即, public PathImpl() { }?這是GWT的序列化機制所要求的;如果它不在源中,則序列化RPC響應將失敗。

+0

Sh ... - no。默認的構造函數是私有的。問題是PathImpl來自hibernate-validation-4.1.0.Final.jar –

+1

然後你需要創建自己的類來擴展Hibernate'PathImpl'。那是你的問題。 –

0

我改變了整個東西到托馬斯·布魯爾推薦的RequestFactory。它不像GWT-RPC那麼容易。這就是我收集所有信息並構建示例程序的原因。

對於那些有興趣的人 - here你可以找到一個文件和源代碼樣本。 (單行客戶端記錄器也被實現)(文檔是德文的,但是日誌輸出aso。是英文的......)

1

自定義序列化程序確實存在PathImpl,它只是,除非該類在您的明確引用服務API,它不會被添加到序列化策略中。

目前的解決方法是在服務API的某個位置添加一個虛擬PathImpl字段。 ValidationSupport類存在將這個和其他這樣的類組合在一起,以使這更容易一些。