我有一个电子邮件字段 我想验证它是有效的电子邮件,并验证它在数据库中不存在,所以我在bean中使用了来自hibernate的@Email的有效电子邮件模式:
@NotBlank(message = "{email.required}")
@Email(message = "{invalid.email}")
@Size(max = 25, message = "{long.value}")
并在jsf页面中:
<f:validator binding="#{emailExistValidator}" />
我的问题:
答案 0 :(得分:6)
1-首先发生什么,面部验证器或bean验证?
JSF转换和验证将首先按照在组件上声明的顺序运行,首先使用required
。如果其中任何一个失败,则完全跳过JSF验证的剩余部分和所有bean验证,否则执行所有bean验证。
2-你如何看待bean验证和FacesValidator之间的这种混合,这是不好的做法,如果是这样你有什么建议?
很难回答。它完全取决于验证器的功能要求和目的,以及验证与模型或视图的紧密联系。
如果验证需要每次运行 ,则设置模型属性(因此,它与模型密切相关),则首选bean验证。但是,如果验证只需要运行一次,例如在注册期间(因此,它与特定视图密切相关),然后首选JSF验证。
例如,如果您正在检查电子邮件语法模式,那么bean验证会更有意义,例如:
@Pattern(regexp = "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)", message = "Email is not in valid format")
private String email;
如果您正在检查数据库中存在的电子邮件,那么JSF验证器会更有意义,因为您不希望它在每个属性集上不必要地执行。数据库调用本身并不便宜。
同样,这是主观的。了解最符合业务要求的内容。例如,您可能需要在每个属性集上验证它。