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

4

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

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

现在,我有一个控制器REST方法,需要传递一个Foo的数组(或集合),我想确保每个Foo都有一个非空的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

我认为你在实现中漏掉了一些东西。你需要使用对象图的概念来使其工作。

你的类Foo在其中一个字段上有@NotNull验证,但是你没有真正表达出集合需要什么有效性。

从Hibernate参考文献中可以看到:

对象图验证也适用于集合类型的字段。这意味着任何属性都可以用@Valid进行注释,包括数组、实现java.lang.Iterable(特别是Collection、List和Set)或实现java.util.Map,这将导致在验证父对象时验证每个包含的元素。

所以你的代码应该变成这样:

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

我不同意在这里使用@NotNull注释。如果我的foos参数可以为空怎么办? 我想确保一旦Foo实例在我的数组中,bar字段就始终被设置。 - Frédéric Camblor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接