0

Im working with JSF 2.0 and Glassfish v3. I was testing the functionality of JSR303 bean validation, so I created a validator which implements ConstraintValidator and then annotate that on a property wich I want to validate.

It works fine, but it displays a Glassfish default error page. I don't want this to be displayed, I would rather have the message displayed in a <h:outputText> or something.

Does anybody know how to achieve this?

Here is my validator method:

@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: I know that there are easier ways to validate the length of a string, but the above code snippet is only for demo/testing purposes. I have another plans with the validator.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
eav
  • 2,123
  • 7
  • 25
  • 34
  • @BalusC: I did a second answer... because here in the comment field there's not enough space.. – eav Feb 18 '11 at 14:04

1 Answers1

6

You're mixing two concepts: JSF validation and JSR 303 bean validation. You're implementing JSR303 bean validation, but you're throwing a JSF-specific ValidatorException.

The method should not throw an exception. The method should just return true or false depending on the validation outcome. The message has to be definied in ValidationMessages.properties. JSF will then display it in a <h:message> which is associated with the input component.

See also this documentation on creating custom constraints with a message.


Or if you're actually after a standard JSF validator, then you should be implementing javax.faces.validator.Validator instead, annotate it with @FacesValidator and declare it in view by <f:validator>. It can throw a ValidatorException and the message will be displayed in <h:message> associated with the input component.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555