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

eav*_*eav 0 bean-validation java-ee-6 jsf-2

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

PS:我知道有更简单的方法来验证字符串的长度,但上面的代码片段仅用于演示/测试目的.我有另一个验证器的计划.

Bal*_*usC 6

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

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

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


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