Gerhard, I created the addon and it is available at (1). A demo app can be found here (2)
The addon is based on a custom FacesMessageStorage as suggested by Gerhard. The configurationParameter can be developed in cases where we don't want a global approach as with the addon. (1) = http://sandbox890.googlecode.com/svn/trunk/addons/uniqueValidationMessage (2) = http://sandbox890.googlecode.com/svn/trunk/examples/CrossValNoTargetMessage_extval Regards Rudy. On 18 February 2010 10:24, Gerhard Petracek <[email protected]>wrote: > 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 >> > >
