The following code works fine:

        context.setValidatingObjectsOnCommit(false);

        ValidationResult validationResult = new ValidationResult();
        company.validateForInsert(validationResult);

        if(validationResult.hasFailures()) {
            List failures = validationResult.getFailures();

            for(int i = 0; i < failures.size(); i++) {
                ValidationFailure tmp = (ValidationFailure)
failures.get(i);
                System.out.println("\n" + tmp.getDescription());
            }
        }
        else {
            context.commitChanges();
        }

If I don't lower the flag ValidatingObjectsOnCommit (which means "dirty"
objects will be validated automatically), how can I handle the
validation failures?

Is there any way to do something like the following:

try {
        context.commitChanges();
}
catch(Some ValidationException thrown earlier) {
        // Get failures list and print error messages.
}

Nikos

Στις 11-03-2009, ημέρα Τετ, και ώρα 10:30 +0200, ο/η Andrus Adamchik
έγραψε:
> > Is the following correct?
> 
> 
> Looks about right. Also there's a few pre-canned classes implementing  
> ValidationFailure in the org.apache.cayenne.validation package that  
> can be used to build failures.
> 
> > Or how can I retrieve the error message
> > from the validationResult when a ValidationException is thrown
> 
> http://cayenne.apache.org/doc/api/org/apache/cayenne/validation/ValidationResult.html
> 
> Use 'getFailures()' to get a list of failures, and analyze them one by  
> one using ValidationFailure methods.
> 
> Andrus
> 
> On Mar 11, 2009, at 9:36 AM, Νίκος Παράσχου wrote:
> 
> > Thank you Andrus,
> >
> > Yes, I do not throw the exception myself. But, how am I going to  
> > handle
> > the exception thrown by Cayenne? Or how can I retrieve the error  
> > message
> > from the validationResult when a ValidationException is thrown, so  
> > that
> > I can print it in the GUI?
> >
> > Is the following correct?
> >
> >    @Override
> >    protected void validateForSave(ValidationResult validationResult) {
> >      super.validateForSave(validationResult);
> >
> >      if(getCompanyName().equalsIgnoreCase("")) {
> >
> >          validationResult.addFailure(new ValidationFailure() {
> >
> >                @Override
> >                public Object getSource() {
> >                    return this;
> >                }
> >
> >                @Override
> >                public Object getError() {
> >                    return Company.CNAME_PROPERTY;
> >                }
> >
> >                @Override
> >                public String getDescription() {
> >                    return "My error message";
> >                }
> >            });
> >      }
> >    }
> >
> > Nikos
> >
> > Στις 10-03-2009, ημέρα Τρι, και ώρα 18:16 +0200, ο/ 
> > η Andrus Adamchik
> > έγραψε:
> >> The code example looks about right. However this is probably what's
> >> wrong: "When a specific condition is not met, a ValidationException  
> >> is
> >> thrown.". You should not throw the exception yourself. Just add an
> >> error to the validationResult, and let Cayenne throw it later.
> >>
> >> Andrus
> >>
> >>
> >> On Mar 10, 2009, at 5:03 PM, Νίκος Παράσχου wrote:
> >>
> >>> Hello,
> >>>
> >>> I implemented validateForSave(ValidationResult validationResult) in
> >>> one
> >>> of my ObjEntities. When a specific condition is not met, a
> >>> ValidationException is thrown.
> >>>
> >>> How can I handle this ValidationException?
> >>>
> >>> The following doesn't work (I get: ValidationException is not thrown
> >>> anywhere inside block try{}):
> >>>
> >>> try {
> >>>   mycontext.commit();
> >>> }
> >>> catch(ValidationException vex) {
> >>>   ...
> >>> }
> >>>
> >>> Thank you,
> >>> Nikos
> >>>
> >>>
> >>>
> >>
> >
> >
> 

Reply via email to