2012-01-11 90 views
4

我有一個簡單類Foo,說像這樣的:彈簧3,JSR-303(豆驗證)和驗證集合

public class Foo { 
    @NotNull 
    private String bar; 
    public String getBar(){ return bar; } 
    public void setBar(String _bar){ this.bar = _bar; } 
} 

現在,我有采取的陣列控制器REST方法(或收集)Foos的地方,我想確保每個Foo都有一個非空的酒吧屬性。 我想到了用@Valid註釋將使伎倆,但現在看來,這是不是:

@Controller 
public class MyController { 
    @RequestMapping(value="/foos", method=RequestMethod.POST) 
    public @ResponseBody String createFoos(@Valid @RequestBody Foo[] foos){ 
     // blah blah blah 
     return "yeah"; 
    } 
} 

注意:它不會用List <富>工作,要麼。但是有了獨特的Foo它就可以工作!

看起來像Spring驗證在我們有「多個」對象(在集合或數組中)時不起作用。

我甚至試圖用自定義註釋實現HandlerMethodArgumentResolver,但我不知道如何在BindingResult中定義「索引屬性名稱」。

如果有人知道這個問題的解決方法,將不勝感激! :)

回答

0

我認爲你在實現中錯過了一些東西。你會想使用對象圖的概念來完成這個工作。

您的班級Foo對其某個字段進行了@NotNull驗證,但您並未真正表達需要對該集合有效的內容。

從Hibernate參考:

對象圖的驗證方法也適用於集合類型的字段。這意味着任何屬於數組的實現java.lang.Iterable(特別是Collection,List和Set)的屬性或實現java.util.Map的屬性都可以使用@Valid進行註釋,這會導致每個包含的元素都被驗證,對象被驗證。

所以,你的代碼將成爲

@Controller 
public class MyController { 
    @RequestMapping(value="/foos", method=RequestMethod.POST) 
    public @ResponseBody String createFoos(@Valid @NotNull @RequestBody Foo[] foos){ 
     // blah blah blah 
     return "yeah"; 
    } 
} 
+0

我這裏的@NotNull註釋不同意。 如果我的foos參數可以爲空可以怎麼辦? 我想確保一旦Foo實例位於我的數組中,就會始終設置bar字段。 – 2012-01-27 17:55:18