我现在负责一个 JSF 2.0 应用程序,其中所有内容都通过自定义验证器进行验证,这完全破坏了 *.xhtml 文件。我尝试将验证迁移到 JSR-303 bean 验证,效果很好。
由于 JSR-303 不验证类级别的约束,我不想保留一个自定义验证器来验证请求表单至少有一个字段已填充。
验证器注册到每个字段并获取一个字符串数组,其中包含其他字段的名称,它必须检查输入。问题是,当 JSR-303 出现在类路径中时,自定义验证器的属性未设置,因此它不知道其他字段的名称。验证器仍会被触发,但最终会显示一条消息,即未提供任何输入。
我已经查看了日志文件输出,但唯一的区别是
11:22:50,403 INFO [Version] Hibernate Validator 4.2.0.Final
11:22:50,450 INFO [ExternalSpecifications] MyFaces Bean Validation support enabled
代替
11:02:10,472 INFO [ExternalSpecifications] MyFaces Bean Validation support disabled
另一个区别是以下输出,当第一次触发验证时,当 JSR-303 存在时出现:
11:23:09,906 INFO [_ExternalSpecifications] MyFaces Unified EL support disabled
11:23:09,906 INFO [_ExternalSpecifications] MyFaces Bean Validation support enabled
我在 JBoss 5.1 jdk6 上使用 MyFaces 2.0、Hibernate Validator 4.2
更新:
<cc:formular bean="#{bankenBean}">
<h:outputLabel for="bankleitzahl">
<span class="kurztaste">B</span>ankleitzahl:</h:outputLabel>
<h:inputText id="bankleitzahl" accesskey="b" size="10" maxlength="8"
value="#{bankenBean.bankleitzahl}">
<audi:notEmptyValidator dependsOn="bic name ort"
detail="Eines dieser Felder muss gefüllt sein." />
</h:inputText>
<h:message for="bankleitzahl" errorClass="fehlertext" />
<h:outputLabel for="bic">B<span class="kurztaste">I</span>C:</h:outputLabel>
<h:inputText id="bic" accesskey="i" size="12" maxlength="11"
value="#{bankenBean.bic}">
<audi:notEmptyValidator dependsOn="bankleitzahl name ort"
detail="Eines dieser Felder muss gefüllt sein." />
</h:inputText>
<h:message for="bic" errorClass="fehlertext" />
<h:outputLabel for="name">
<span class="kurztaste">N</span>ame der Bank:</h:outputLabel>
<h:inputText id="name" accesskey="n" size="35" maxlength="58"
value="#{bankenBean.name}">
<audi:notEmptyValidator dependsOn="bankleitzahl bic ort"
detail="Eines dieser Felder muss gefüllt sein." />
</h:inputText>
<h:message for="name" errorClass="fehlertext" />
<h:outputLabel for="ort">
<span class="kurztaste">O</span>rt der Bank:</h:outputLabel>
<h:inputText id="ort" accesskey="o" size="35" maxlength="35"
value="#{bankenBean.ort}">
<audi:notEmptyValidator dependsOn="bankleitzahl bic name"
detail="Eines dieser Felder muss gefüllt sein." />
</h:inputText>
<h:message for="ort" errorClass="fehlertext" />
</cc:formular>
这就是使用 notEmptyValidator 的地方。它在 facelets.taglib.xml 中定义:
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd">
<namespace>http://rzf.finnrw.de/audi</namespace>
<tag>
<tag-name>notEmptyValidator</tag-name>
<validator>
<validator-id>de.finnrw.rzf.audi.NotEmptyValidator</validator-id>
</validator>
<attribute>
<name>dependsOn</name>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>detail</name>
<type>java.lang.String</type>
</attribute>
</tag>
当 JSR-303 出现在类路径中时,此自定义验证器仍被注册为触发。但它没有设置它的属性,因此不知道它必须检查的字段。