0

我正在使用 JSF 2.0 和 Glassfish v3。我正在测试 JSR303 bean 验证的功能,所以我创建了一个验证器,它实现ConstraintValidator然后在我想要验证的属性上注释它。

它工作正常,但它显示 Glassfish 默认错误页面。我不希望显示此内容,我希望将消息显示在 a<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:我知道有更简单的方法来验证字符串的长度,但上面的代码片段仅用于演示/测试目的。我对验证者有另一个计划。

4

1 回答 1

6

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

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

另请参阅有关使用消息创建自定义约束的文档


或者,如果您实际上是在使用标准的 JSF 验证器,那么您应该javax.faces.validator.Validator改为实现,使用 注释它@FacesValidator并在视图中声明它<f:validator>。它可以抛出一个ValidatorException并且消息将<h:message>与输入组件关联显示。

于 2011-02-18T13:13:23.020 回答