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

Mah*_*leh 2 validation jsf java-ee bean-validation jsf-2

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

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

并在jsf页面中:

<f:validator binding="#{emailExistValidator}" />
Run Code Online (Sandbox Code Playgroud)

我的问题:

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

Bal*_*usC 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;
Run Code Online (Sandbox Code Playgroud)

如果您正在检查存在于数据库中的电子邮件,那么JSF验证器会更有意义,因为您不希望它在每个属性集上不必要地执行.数据库调用本身并不便宜.

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