hi rudy,

you mentioned it correctly. it's a specific functionality
of AbstractCompareStrategy.

as alternative it's possible to provide a custom FacesMessageStorage which
filters messages before they get added (directly
in FacesMessageStorage#addFacesMessage). that would allow a better
performance as well as an add-on instead of a configuration parameter.

regards,
gerhard

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces


2010/2/18 Rudy De Busscher <[email protected]>

> Hi all,
>
> There are cases that the validation message is shown twice for some Cross
> Validations.
>
> If we use for instance the Equals or NotEquals annotations where the target
> component is also shown on the same page, the message is shown twice.
> This is the example:
>
> *public class Person
> {
>     @NotEquals(value = "lastName", validationErrorMsgKey = "First name and
> last name can't have the same value")
>     private String firstName;
>
>     private String lastName;
> ...
> }
>
>
>     <h:messages />
>     <h:form>
>         <h:panelGrid columns="2">
>             <h:outputLabel value="First name" for="firstName" />
>             <h:inputText id="firstName"
> value="#{personBean.selectedPerson.firstName}" label="First Name" />
>             <h:outputLabel value="Last name" for="lastName" />
>             <h:inputText id="lastName"
> value="#{personBean.selectedPerson.lastName}" label="Last Name" />
>         ....
>         </h:panelGrid>
>     </h:form>*
>
> This is expected behaviour since the code wants to mark both fields as
> invalid and shows the message for each field.  But when the errors are
> displayed on the top of the page, the message seems to be duplicated. And in
> case of the above example with a custom validation message, it can be
> interpreted as a bug.
>
> The only way, I found, to avoid the 'duplicate' message (other then
> creating a custom strategy or annotation) was the creation of a
> ValidationExceptionInterceptor that filters out the duplicate message.
>
> *public class NoTargetMessageValidationExceptionInterceptor implements
>         ValidationExceptionInterceptor
> {
> public boolean afterThrowing(UIComponent uiComponent,
>             MetaDataEntry metaDataEntry, Object convertedObject,
>             ValidatorException validatorException,
>             ValidationStrategy validatorExceptionSource)
>     {
>         boolean result = true;
>
>         FacesMessageStorage storage = getStorage(FacesMessageStorage.class,
>                 FacesMessageStorage.class.getName());
>         for (FacesMessageHolder holder : storage.getFacesMessages())
>         {
>             if (holder.getFacesMessage().getDetail().equals(
>                     validatorException.getFacesMessage().getDetail()))
>             {
>                 result = false;
>             }
>         }
>         return result;
>     }
>     ...
> }*
>
> This code is not specific for Cross Validation messages, but is generic.
> But in most cases, a duplicate message comes from the usage of
> CrossValidation annotations.
>
> Should there be a configuration option (like a ValidationParameter) created
> in version x.x.4 so that the useTargetComponentToDisplayErrorMsg outcome is
> not only specified in the code but also by the annotation?
>
> regards
> Rudy
>

Reply via email to