@Email 休眠验证程序注释在 JSF 2 Bean 中不起作用
@Email hibernate validator annotation not working in JSF 2 Bean
我有一个 JSF 2 应用程序,但我无法对 JSF ManagedBean 属性进行 @Email 验证。
这是我的堆栈:
- 玻璃鱼 3.1.1
- Mojarra 2.2.9 / JSF 2.2
我已经检查了我的 web-inf/class 我有推荐的这些库 here:
- javax.validation:验证-api:jar:1.0.0.GA
- org.hibernate:hibernate-validator:jar:4.3.2.Final
我的代码:
<h:body>
<!-- <h:log id="log" /> -->
<h:messages globalOnly="true" style="color:red;margin:8px;" />
<h:form id="form">
<f:validateBean>
<h:outputLabel for="email" value="Enter your email: " />
<h:inputText id="email" value="#{userEditBean.email}" />
<h:message for="email" />
<h:commandButton type="submit" value="Enviar"
action="#{userEditBean.submit()}" />
</f:validateBean>
</h:form>
托管 bean:
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.validation.constraints.Pattern;
@ManagedBean
@SessionScoped
public class UserEditBean {
private static final String CURRENT_PAGE = "";
private static final String USER_LIST_PAGE = "userList";
//@Pattern(regexp = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+", message = "Email format is invalid.")
@Email(message = "Email format is invalid.")
private String email;
public String submit() {
return CURRENT_PAGE;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
备注:
- JSR 303 标准验证(@Null、@NotNull、...)完美工作,我可以使用 @Pattern 进行电子邮件验证,如图所示 here,但我想知道为什么其他休眠验证器注释不起作用。
- 如果我尝试在带有@Email 注释的 属性 中插入一个带有无效电子邮件的模型,Hibernate 验证器将完美运行,hibernate 在预插入验证中抛出异常。
- 我试过注释字段或getter,如前所述here,但都没有用。
- 我已经查看了 hibernate validator reference integration chapter,但它只是说您必须使用标签来强制验证。
是否可以在 JSF bean 中使用来自 hibernate 验证器的附加注释或仅使用 javax.validation.constraints.* 标准注释? (without using validator programmatically)
更新:2015-03-23:响应 BalusC 回答:
Glassfish 3.1.1 附带 hibernate-validator 包,它与我使用的版本相同,我可以在服务器启动日志中看到:
2015-03-23T14:11:24.772+0100|Información: Inicializando Mojarra 2.2.9 (-SNAPSHOT 20141218-0939 https://svn.java.net/svn/mojarra~svn/tags/2.2.9@14083) para el contexto '/fwk4jsf'
2015-03-23T14:11:25.368+0100|Información: HV000001: Hibernate Validator 4.3.2.Final
我的 glassfish-web.xml 中也有 delegate="true",但它也不起作用。
谢谢。
作为 Java EE 容器的 GlassFish 已经 随其他 JSF 和 Bean Validation 开箱即用。升级它们应该通过替换 /glassfish/modules
文件夹中的 JAR 来完成。
如果由于某种原因这不可能,并且您确实需要通过 webapp 升级它们,那么您需要通过将以下条目添加到 [=12= 来指示 GlassFish 首先在 webapp 中查找库]:
<class-loader delegate="false" />
否则 GlassFish 仍会从自己的库中加载它们 and/or class会出现加载问题,因为存在重复的 class 具有相同名称的库,从而导致库之间的混淆和冲突在具有多个 classloader 的应用程序中,例如 instanceof
在另一个 classloader 加载的 class 实例上错误地返回 false
图书馆。
我有一个 JSF 2 应用程序,但我无法对 JSF ManagedBean 属性进行 @Email 验证。
这是我的堆栈:
- 玻璃鱼 3.1.1
- Mojarra 2.2.9 / JSF 2.2
我已经检查了我的 web-inf/class 我有推荐的这些库 here:
- javax.validation:验证-api:jar:1.0.0.GA
- org.hibernate:hibernate-validator:jar:4.3.2.Final
我的代码:
<h:body>
<!-- <h:log id="log" /> -->
<h:messages globalOnly="true" style="color:red;margin:8px;" />
<h:form id="form">
<f:validateBean>
<h:outputLabel for="email" value="Enter your email: " />
<h:inputText id="email" value="#{userEditBean.email}" />
<h:message for="email" />
<h:commandButton type="submit" value="Enviar"
action="#{userEditBean.submit()}" />
</f:validateBean>
</h:form>
托管 bean:
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.validation.constraints.Pattern;
@ManagedBean
@SessionScoped
public class UserEditBean {
private static final String CURRENT_PAGE = "";
private static final String USER_LIST_PAGE = "userList";
//@Pattern(regexp = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+", message = "Email format is invalid.")
@Email(message = "Email format is invalid.")
private String email;
public String submit() {
return CURRENT_PAGE;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
备注:
- JSR 303 标准验证(@Null、@NotNull、...)完美工作,我可以使用 @Pattern 进行电子邮件验证,如图所示 here,但我想知道为什么其他休眠验证器注释不起作用。
- 如果我尝试在带有@Email 注释的 属性 中插入一个带有无效电子邮件的模型,Hibernate 验证器将完美运行,hibernate 在预插入验证中抛出异常。
- 我试过注释字段或getter,如前所述here,但都没有用。
- 我已经查看了 hibernate validator reference integration chapter,但它只是说您必须使用标签来强制验证。
是否可以在 JSF bean 中使用来自 hibernate 验证器的附加注释或仅使用 javax.validation.constraints.* 标准注释? (without using validator programmatically)
更新:2015-03-23:响应 BalusC 回答:
Glassfish 3.1.1 附带 hibernate-validator 包,它与我使用的版本相同,我可以在服务器启动日志中看到:
2015-03-23T14:11:24.772+0100|Información: Inicializando Mojarra 2.2.9 (-SNAPSHOT 20141218-0939 https://svn.java.net/svn/mojarra~svn/tags/2.2.9@14083) para el contexto '/fwk4jsf'
2015-03-23T14:11:25.368+0100|Información: HV000001: Hibernate Validator 4.3.2.Final
我的 glassfish-web.xml 中也有 delegate="true",但它也不起作用。
谢谢。
作为 Java EE 容器的 GlassFish 已经 随其他 JSF 和 Bean Validation 开箱即用。升级它们应该通过替换 /glassfish/modules
文件夹中的 JAR 来完成。
如果由于某种原因这不可能,并且您确实需要通过 webapp 升级它们,那么您需要通过将以下条目添加到 [=12= 来指示 GlassFish 首先在 webapp 中查找库]:
<class-loader delegate="false" />
否则 GlassFish 仍会从自己的库中加载它们 and/or class会出现加载问题,因为存在重复的 class 具有相同名称的库,从而导致库之间的混淆和冲突在具有多个 classloader 的应用程序中,例如 instanceof
在另一个 classloader 加载的 class 实例上错误地返回 false
图书馆。