2010-10-24 225 views
4

我是新的春季框架。我目前正在建立一些消息經理形式。不允許現場驗證

這裏我的新聞實體的樣本:

class News 
{ 
    @NotNull 
    long id; 
    @NotNull 
    long idAuthor; 
    @Size(max=255) 
    String content; 
} 

正如你所看到的,我用的JSR303註解驗證和春天。我想驗證我的「新聞編輯表單」。

@RequestMapping(value = "/edit" , method = RequestMethod.POST) 
    public String editAction(@Valid @ModelAttribute News news, BindingResult result) 
    { 
     System.err.println(result.hasErrors()); 
      ... 
      return "editView"; 
    } 

定義允許領域:

//initBinder function : 
    binder.setAllowedFields("content"); 

嗯,我試圖驗證只有「內容」字段(允許外地在我的文件夾設置)...但總是春驗證所有領域的定義在我的實體(所以「ID」&「idAuthor」返回錯誤)

我怎麼只驗證允許的字段(設置在initBinder函數)?

+0

我是否必須創建一個只有「內容」字段的特殊實體? – Pierre 2010-10-24 16:42:39

回答

4

沒有好的方法來做到這一點。通過調用validator.validateProperty(news, "content")

  • 可以定義確認團組

    • 您可以驗證特定屬性:

      @Size(max=255, groups = {Default.class, WebValidation.class})  
      String content; 
      

      和驗證指定的組

      JSR-303提供了選擇性驗證兩種方法:validator.validate(news, WebValidation.class);

    這些方法都不是由Spring MVC直接支持的。您可以自動裝入JSR-303 Validator並手動調用這些方法,但它們返回Set<ConstraintViolation<?>>,並且將這些ConstraintViolation s置入BindingResult的代碼深埋在Spring內部內部,不能輕易重用(請參閱SpringValidatorAdapter)。

    有修復版本3.1的@Valid-樣式方法(SPR-6373)支持驗證組的功能請求。因此,除了創建一個特殊的DTO類,您沒有太多的選擇:您可以使用手動驗證(無需JSR-303),或者您可以將SpringValidatorAdapter中的代碼複製粘貼到您自己的實用程序方法中,然後將代碼從SpringValidatorAdapter複製粘貼到您自己的實用程序方法中手動調用JSR-303 Validator的方法。

  • +0

    嘿,非常感謝你,這正是我所搜索的。 – Pierre 2010-10-24 18:52:49