JSR303 ConstraintValidator,如何在没有错误页面的情况下显示消息

时间:2011-02-18 13:00:01

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

我正在使用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:我知道有更简单的方法来验证字符串的长度,但上面的代码片段仅用于演示/测试目的。我对验证器有另一个计划。

1 个答案:

答案 0 :(得分:6)

您混合了两个概念:JSF验证和JSR 303 bean验证。您正在实现JSR303 bean验证,但是您正在抛出一个特定于JSF的ValidatorException

该方法不应抛出异常。该方法应该返回truefalse,具体取决于验证结果。该消息必须在ValidationMessages.properties中定义。然后,JSF将其显示在与输入组件关联的<h:message>中。

另请参阅this documentation有关使用消息创建自定义约束的信息。


或者,如果您在标准JSF验证程序之后实际,那么您应该实现javax.faces.validator.Validator,使用@FacesValidator对其进行批注,然后通过{{{ 1}}。它可以抛出<f:validator>,并且消息将显示在与输入组件关联的ValidatorException中。