2012-04-05 79 views
1

我有一個對象Foo,其保持參考對象Bar具有參照對象Baz,並且爲了Foo是有效的,Bar必須有一個有效的,非空引用到Baz如何在Spring MVC中驗證我的域對象上的對象的字段?

的問題是,Bar需要一個有效的,非空Baz是有效的,所以我不能簡單地把驗證在那裏,我需要它是內Foo

這裏的階級結構的一個簡單的僞版本我說的是:

class Foo { 
    // Bar needs to have a valid Baz. Something like this would be ideal: 
    // @HasAValidBaz(message="Baz is required") 
    Bar bar; 
} 

class Bar { 
    // Baz can be null and Bar will still be valid 
    // But if there _is_ a Baz, it needs to be valid 
    Baz baz; 
} 

class Baz { 
    @NotBlank(message="My String is required") 
    String myString; 
} 

我知道我可以用類級別的定製驗證註解做到這一點,但問題是,這些錯誤的對象和相應的消息適用於類實例,而不是字段實例,我需要能夠在正確的表單字段旁邊輕鬆顯示錯誤消息。

有沒有一個很好的方法來做到這一點,或者我堅持在控制器中實現這種驗證?

回答

1

註釋很好,但在這種情況下可能不合適。問題在於註釋被標記在實際的類上,這意味着您不能在同一個類上有兩種類型的驗證註釋 - 這似乎是您的問題。對於你來說,使用老派的Spring MVC方法來實現Spring Validator類可能更合適。這裏有一個例子:

public class FooValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return Foo.class.equals(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 

     Foo foo = (Foo) target; 

     if(foo.getBar() == null) { 
      errors.rejectValue("bar", "bar[emptyMessage]"); 
     } 
     else if(foo.getBar().getBaz() == null){ 
      errors.rejectValue("bar.baz", "bar.baz[emptyMessage]"); 
     } 
    } 
} 

而且因爲它是使用註釋你的Spring控制器仍然是幾乎相同的:

@Controller 
public class FooController { 

    @InitBinder("foo") 
    protected void initBinder(WebDataBinder binder) { 
     binder.setValidator(new FooValidator()); 
    } 

    @RequestMapping(value="fooPage", method = RequestMethod.POST) 
    public String processSubmit(@Valid Foo foo, BindingResult result, ModelMap m) { 
     if(result.hasErrors()) { 
      return "fooPage"; 
     } 
     ... 
     return "successPage"; 
    } 
} 
+0

如果我走這條路,我還可以在'Foo'等領域與「正常」的驗證註釋,比如'@NotNull','@NotBlank'等等。或者'FooValidator'會覆蓋所有這些? (很顯然,我對事物進行了大量的簡化,所以如果讓我看看剩下的驗證過程會更有幫助,請告訴我。例如,我已經有2個其他自定義驗證器可以通過Foo類的註釋來處理與多字段驗證問題) – cdeszaq 2012-04-05 19:57:30

+0

我發現了另一個問題,它可以很好地回答這個問題:http://stackoverflow.com/questions/8819676/springmvc-jsr303-validator-co-exist-with-spring-webdatabinder-validator-in - 酮一。基本上,您讓控制器使用註釋自動驗證。然後,在控制器方法內調用您的自定義驗證器,傳遞您之前驗證的綁定結果。 – 2012-04-05 22:34:33