myfaces-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Apache Wiki <wikidi...@apache.org>
Subject [Myfaces Wiki] Update of "Extensions/Validator/Getting Started/Cross Validation" by GerhardPetracek
Date Wed, 08 Apr 2009 19:20:13 GMT
Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Myfaces Wiki" for change notification.

The following page has been changed by GerhardPetracek:
http://wiki.apache.org/myfaces/Extensions/Validator/Getting_Started/Cross_Validation

New page:
= Using cross-validation =

It's quite easy to use it.

== Examples ==

Example 1:
{{{
public class Person
{
    @NotEquals("lastName")
    private String firstName;

    private String lastName;
...
}
}}}

In this case we refer a local property.

Example 2:
{{{
public class RegistrationPage
{
    private Person person = new Person();

    @Equals("person.password")
    private String oldPassword;
...
}
}}}

In this case we refer a property of a local reference.

Example 3:
{{{
public class RegistrationPage
{
    @Equals("#{person.password}")
    private String oldPassword;
...
}
}}}

In this case we refer a property of a bean.

== Details of the examples ==

Within the page you just have to bind a property which has a cross-validation constraint.[[BR]]
If both, the source property as well as the referenced target, are bound to input components
of the same form, the converted objects are used for validation. In case of a validation error,
the validation error message(s) is/are displayed.

== Model aware cross-validation (since 1.x.2) ==

If the target of the cross-validation isn't bound to an input component of the same form,
the model value of the target is used for validation. The property which triggers the cross-validation
always "uses" the converted object (not the model value).

That means:[[BR]]
Normal cross-validation: converted object (constraint source) + converted object (constraint
target)
Model aware cross-validation: converted object (constraint source) + model object (constraint
target)

== Reverse validation error messages ==

In case of model aware cross-validation the following issues are possible:
 * Missing "target component" to display validation error message
 * Inconsistent validation messages (the message is automatically displayed at the "source
component", but the default message makes no sense for the user)

'''Solution''':
The validation strategy optionally provides a meaningful validation error message. It's called
a reverse validation error message.

== Custom cross-validation strategies ==

Example 1:

{{{
@SkipValidationSupport
public class EqualsStrategy extends AbstractCompareStrategy
{
    public boolean useTargetComponentToDisplayErrorMsg(CrossValidationStorageEntry crossValidationStorageEntry)
    {
        return true;
    }

    protected String getValidationErrorMsgKey(Annotation annotation, boolean isTargetComponent)
    {
        return ((Equals) annotation).validationErrorMsgKey();
    }

    public boolean isViolation(Object object1, Object object2, Annotation annotation)
    {
        return object1 != null && !object1.equals(object2);
    }

    public String[] getValidationTargets(Annotation annotation)
    {
        return ((Equals) annotation).value();
    }
}
}}}

In case of model aware cross-validation the validation error message is displayed at the source
component instead of the target component.[[BR]]
Since the message is still meaningful, there's no need to provide a special reverse message.

Example 2:
{{{
...
    @Override
    protected String getReverseErrorMessageSummary(Annotation annotation)
    {
        return "meaningful validation error message summary";
    }
...
    @Override
    protected String getReverseErrorMessageDetail(Annotation annotation)
    {
        return "meaningful validation error message details";
    }
...
}}}

... override these methods to display a meaningful reverse validation message at the source
component.

Mime
View raw message