Say I have the following simple java bean:
class MyBean { private Date startDate; private Date endDate; //setter, getters etc... }
Is there a mechanism in JSR 303 to create a custom validator that validates the constraint that startDate must be before endDate?
It seems to me to be a common use case, yet I cannot find any examples of this kind of multiple property relationsship constraint.
The Bean Validation API is a Java specification which is used to apply constraints on object model via annotations. Here, we can validate a length, number, regular expression, etc. Apart from that, we can also provide custom validations. As Bean Validation API is just a specification, it requires an implementation.
JavaBeans Validation (Bean Validation) is a new validation model available as part of Java EE 6 platform. The Bean Validation model is supported by constraints in the form of annotations placed on a field, method, or class of a JavaBeans component, such as a managed bean. Constraints can be built in or user defined.
@NotNull validates that the annotated property value is not null. @AssertTrue validates that the annotated property value is true.
JSR-303 bean validation is an specification whose objective is to standardize the validation of Java beans through annotations. The objective of the JSR-303 standard is to use annotations directly in a Java bean class.
I can think of a few things to try.
You could create a Constraint
with a target of the type itself with an appropriate validator:
@ValidateDateRange(start="startDate", end="endDate") public class MyBean {
You could encapsulate a date range in a type and validate that:
public class DateRange { private long start; private long end; public void setStart(Date start) { this.start = start.getTime(); } // etc.
You could add a simple property that performs the check:
public class MyBean { private Date startDate; private Date endDate; @AssertTrue public boolean isValidRange() { // TODO: null checks return endDate.compareTo(startDate) >= 0; }
If you're using Hibernate Validator in version 4.1 or later you can use the @ScriptAssert constraint together with a scripting or expression language to express this kind of constraint. Using JavaScript your example would look like this:
@ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)") public class CalendarEvent { private Date startDate; private Date endDate; //... }
You can get an even more compact syntax by creating a custom constraint for the script language of your choice:
@JexlAssert("_.startDate < _.endDate") public class CalendarEvent { private Date startDate; private Date endDate; //... }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With