【问题标题】:Spring 3, JSR-303 (bean validation) and validating collectionSpring 3,JSR-303(bean 验证)和验证集合
【发布时间】:2012-02-08 08:25:39
【问题描述】:

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

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

现在,我有一个控制器 REST 方法,它采用 Foos 的数组(或集合),我想确保每个 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 就可以了!

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

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

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

【问题讨论】:

    标签: java spring-mvc bean-validation


    【解决方案1】:

    我认为您在实施过程中遗漏了一些事情。您需要使用对象图的概念来完成这项工作。

    您的 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";
        }
    }
    

    【讨论】:

    • 我不同意这里的@NotNull 注释。如果我的 foos 参数可以为空怎么办?只要 Foo 实例在我的数组中,我想确保始终设置 bar 字段。
    猜你喜欢
    • 2013-11-23
    • 2015-01-10
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2011-01-31
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多