关于在一个字段上使用FacesValidator(JSF验证)和Bean验证的问题

时间:2011-09-27 16:42:40

标签: validation jsf java-ee jsf-2 bean-validation

我有一个电子邮件字段 我想验证它是有效的电子邮件,并验证它在数据库中不存在,所以我在bean中使用了来自hibernate的@Email的有效电子邮件模式:

@NotBlank(message = "{email.required}")
@Email(message = "{invalid.email}")
@Size(max = 25, message = "{long.value}")

并在jsf页面中:

<f:validator binding="#{emailExistValidator}" />

我的问题:

  1. 首先发生什么,面部验证器或bean验证?
  2. 您如何看待bean验证和 FacesValidator,这是不好的做法,如果是这样你有什么建议吗?

1 个答案:

答案 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验证器会更有意义,因为您不希望它在每个属性集上不必要地执行。数据库调用本身并不便宜。

同样,这是主观的。了解最符合业务要求的内容。例如,您可能需要在每个属性集上验证它。