2012-01-11 94 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