Spring MVC中的验证器

时间:2013-01-08 09:29:44

标签: spring-mvc bean-validation

我们在Spring MVC中使用@ Min,@ Max,@ NotNull等注释进行服务器端验证。这些注释应该放在Model Class中。我希望在需要时应用这样的注释,我不想在这里应用这样的注释模特课。

例如。

我有一个名为Person,Gender,Email属性的Person。 如果我将@NotNull注释放在电子邮件属性上,那么它将获得全局应用,如果我的要求发生变化,就好像在我的系统中有两个人学生和教师和教师注册电子邮件是可选的但是对于学生它不是null那么我怎么能实现这个目标。

我可以动态地应用验证注释,例如上面的例子 -

如果UserRegistration适用于教师,则电子邮件是可选的。

如果UserRegistration适用于学生,则电子邮件是强制性的。

3 个答案:

答案 0 :(得分:5)

要实现此行为,我建议使用动态激活的组。看看我的例子。

Person.java

class Person {

    @NotNull(groups = StudentChecks.class)
    @Email
    private email;

    // other members with getters/setters

    public interface StudentChecks {
    }
}

在这种情况下,@NotNull约束仅在激活StudentChecks组时执行。要按条件激活验证组,Spring会提供特殊注释@Validated

StudentController.java

@Controller
public class StudentController {

    @RequestMapping(value = "/students", method = RequestMethod.POST)
    public String createStudent(@Validated({Person.StudentChecks.class}) Person student, BindingResult result) {
        // your code
    }

}

您可以在那里找到更多详细信息:

答案 1 :(得分:1)

您需要实现自己的验证器并在控制器中注册。

答案 2 :(得分:0)

这是使用bean验证提出的问题之一。事实上它们实际上是全球性的。

一个常见的问题是更新一个带有@before ore @after注释的日期导致无效更新的实体,实际上这些不应再被检查了。

解决此问题的常用方法是使用DTO或数据传输对象,而不是直接接受控制器中的模型对象,而是专门为该操作创建一个类(您可以在其他操作中重复使用。这样您就可以也可以将你的模型与你的软件实际上的连接断开,并且它更安全,因为spring只会绑定你扔给他的所有内容。例如,如果用户对象有一个admin标志,如果这个admin标志被发布并设置为true,spring将很高兴在模型对象中填充它。使用DTO,你可以复制你需要的字段而忽略其余的字段。