I am using Omnifaces <o:validateBean />
to use JSR303 bean validation with a class level constraint.
The whole thing works quite good. The validation message is displayed in a Primefaces <p:messages />
component. Now I wanted to know whether it is possible to narrow the error message to a more precise component (i. e. a <p:message />
tag on a specific element)? In the example below I want to direct the error message to the <p:message />
component with id="id_msg_anniversary"
(or if that is possible, to both id="id_msg_anniversary"
and id="id_msg_wedding"
).
One of my intention is to validate everything with bean validation and not to use <o:validateOrder />
or <o:validateMultiple />
.
@DayIsBeforeAnniversary
@Entity
public class Person implements Serializable
{
@Temporal(TemporalType.DATE)
private Date weddingDay;
@Temporal(TemporalType.DATE)
private Date silverWeddingAnniversary;
...
}
<p:messages id="id_messages" />
<h:outputLabel value="Wedding Day" />
<p:message id="id_msg_wedding" display="icon" for="id_wedding" />
<p:calendar
id="id_wedding"
value="#{personController.person.weddingDay}"> <br />
<h:outputLabel value="Silver Wedding Anniversary" />
<p:message id="id_msg_anniversary" display="icon" for="id_anniversary" />
<p:calendar
id="id_anniversary"
value="#{personController.person.silverWeddingAnniversary}" /> <br/>
<p:commandButton
value="test"
action="#{personController.navigate()}"
update="@all"/>
<o:validateBean value="#{personController.person}" />
public class DayIsBeforeAnniversaryValidator implements ConstraintValidator<DayIsBeforeAnniversary, Person>
{
@Override
public boolean isValid(Person person, ConstraintValidatorContext context)
{
return person == null
|| person.getWeddingDay() == null
|| person.getSilverWeddingAnniversary() == null
|| person.getWeddingDay().before(person.getSilverWeddingAnniversary());
}
...
}
public @interface DayIsBeforeAnniversary { ... }
For clarification I could attach more code.