2013-01-08 72 views
1

我们在Spring MVC中使用@Min,@Max,@NotNull等进行服务器端验证。注释应该放在Model Class中。假设我想在需要时应用这些注释,我不想在Model类中应用这些注释。Spring MVC中的验证器

例如。

我有一个具有属性名称,性别,电子邮件的人。 如果我将@NotNull注释放在电子邮件属性上,那么它将得到全局应用,如果我的需求得到改变,就像在我的系统中有两个人学生和老师,并且教师注册电子邮件是可选的,但对于学生它不是null,那么怎么能我实现了这一点。

我可以dynamiclly应用验证注释中的示例 -

上述情况下,如果放在userRegistration是教师然后电子邮件是可选的。

如果UserRegistration是学生,那么电子邮件是强制性的。

回答

1

您需要实施自己的验证器并将其注册到控制器中。

+0

是的,这可选项,我认为这也但我的问题是关于预定义的注释。谢谢你的回复:) – Amogh

0

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

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

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

+0

我没有得到你想说的。 – Amogh

+0

基本上你可以创建多个或多或少具有相同字段但具有不同验证注释的类。然而斯拉瓦Semushin的解决方案似乎更好 –

5

为了实现这种行为,我建议使用动态激活的组,看看我的示例波纹管

Person.java

class Person { 

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

    // other members with getters/setters 

    public interface StudentChecks { 
    } 
} 

在这种情况下,只有当StudentChecks组被激活@NotNull约束将被执行。按条件激活验证组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 
    } 

} 

更多细节,你可以找到有: