Spring 3,JSR-303(bean验证)和验证集合

时间:2012-01-11 23:57:35

标签: java spring-mvc bean-validation

我有一个简单的类Foo,就像这样说:

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

现在,我有一个控制器REST方法,它采用Foos的数组(或集合),我想确保每个Foo都有一个非null的bar属性。 我认为使用@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>无论是。但是有一个独特的Foo它可以工作!

当我们有“多个”对象(在集合或数组中)时,看起来Spring验证不起作用。

我甚至尝试使用自定义注释实现HandlerMethodArgumentResolver,但我不知道如何在BindingResult中定义“索引属性名称”。

如果有人知道此问题的解决方法,我们将不胜感激! :)

1 个答案:

答案 0 :(得分:0)

我认为您在实施过程中遗漏了一些内容。你会想要使用对象图的概念来实现这个目的。

你的类Foo在其中一个字段上有@NotNull验证,但是你还没有真正表达过要对集合有效的内容。

来自Hibernate Reference:

  

对象图验证也适用于集合类型字段。这意味着任何属性都是数组,实现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";
    }
}