我有一个电子邮件字段我想验证它是有效的电子邮件,并验证它不存在于数据库中,所以我使用了bean中hibernate的@Email作为有效的电子邮件模式:
@NotBlank(message = "{email.required}")
@Email(message = "{invalid.email}")
@Size(max = 25, message = "{long.value}")
和JSF页面中的
<f:validator binding="#{emailExistValidator}" />
我的问题:
- 先发生什么,人脸验证器还是bean验证?
- 你怎么看待bean验证和FacesValidator,是不好的做法,如果是,你的建议是什么?
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;
如果您要根据DB检查电子邮件是否存在,那么JSF验证器将更有意义,因为您不希望在每个属性集上不必要地执行它。DB调用本身并不便宜。
再说一次,这是主观的。看看什么最适合业务需求。例如,可能需要在每个属性集上验证它。