In JSR-303 (Bean Validation) you need to define a special annotation for each constraint validator you write. This makes perfect sense if you are creating reusable constraint validators (like the standard @Max
, @NotNull
, etc).
However in real life every validated bean requires its own validator to do more complex business validations. With vanilla JSR-303 implementations you have to create a separate annotation for every validator. This forces developer to write one-time-only annotations and makes the overall concept of bean validation look stupid. The necessity for one-time-only annotations can be avoided if JSR-303 offers some sort of delegating constraint annotation: @ValidateBy(validator=my.custom.Validator)
.
Now to my question:
- Why doesn't JSR-303 include such use-case?
- Is there any official discussion related to this (I was not able to find anything)?
- Do any JSR-303 library offer such functionality (not that it would be hard to implement that)?
UPDATE 1 - Specific use-case (which led to this question)
We have a moderate enterprise application with pretty rich business model (40 manageable entities, 20 embeddable entities, 25 read-only entities). This means that we have a lots of HTML forms. Each form is backed by a designated form bean (70 form beans) with JSR-303 annotations. Some forms require custom non-trivial validation (e.g. if delivery type is email then a contact email must be set, ...). With JSR-303 we have 33 form-bean specific validators with 33 (unnecessary one-time-only) annotations.
With the number of Java classes (entities, controllers, DAOs, DTOs, mappers, validators, etc... right now this makes 800 .java
files) I don't like having any boilerplate code around.