我正在使用JSF 2.0和Glassfish v3。我正在测试JSR303 bean验证的功能,所以我创建了一个实现ConstraintValidator
的验证器,然后在我要验证的属性上注释它。
它工作正常,但它显示Glassfish默认错误页面。我不希望这个显示,我宁愿将消息显示在<h:outputText>
或其他内容中。
有人知道如何实现这个目标吗?
这是我的验证方法:
@Override
public boolean isValid(String searchArg, ConstraintValidatorContext ctx) {
boolean searchArgCorrect = true;
FacesMessage msg;
if(searchArg!=null) {
ctx.disableDefaultConstraintViolation();
if(searchArg.length() < 3) {
ctx.buildConstraintViolationWithTemplate("Searcharg is too short").addConstraintViolation();
searchArgCorrect=false;
msg = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"Searcharg is too short", null);
throw new ValidatorException(msg);
}
}
return searchArgCorrect;
}
PS:我知道有更简单的方法来验证字符串的长度,但上面的代码片段仅用于演示/测试目的。我对验证器有另一个计划。
答案 0 :(得分:6)
您混合了两个概念:JSF验证和JSR 303 bean验证。您正在实现JSR303 bean验证,但是您正在抛出一个特定于JSF的ValidatorException
。
该方法不应抛出异常。该方法应该返回true
或false
,具体取决于验证结果。该消息必须在ValidationMessages.properties
中定义。然后,JSF将其显示在与输入组件关联的<h:message>
中。
另请参阅this documentation有关使用消息创建自定义约束的信息。
或者,如果您在标准JSF验证程序之后实际,那么您应该实现javax.faces.validator.Validator
,使用@FacesValidator
对其进行批注,然后通过{{{ 1}}。它可以抛出<f:validator>
,并且消息将显示在与输入组件关联的ValidatorException
中。