I was attempted to apply multiple @Pattern annotations to a single field:
@Pattern(regexp = "(?=.*[0-9])", message = "Password must contain one digit.")
@Pattern(regexp = "(?=.*[a-z])", message = "Password must contain one lowercase letter.")
@Pattern(regexp = "(?=.*[A-Z])", message = "Password must contain one uppercase letter.")
@Pattern(regexp = "(?=\S+$)", message = "Password must contain no whitespace.")
private String password;
However, I cannot do this. I want individual messages per violated regex constraint on the password field. Is this possible?
My alternative is to use JSF 2.0 f:validatorRegex tags.
You can use the inner
@List
annotation of@Pattern
:Gunnar's solution won't work for me... '.+' in his regexp seem to be missing. However, i'm using Michal's patternList and it works like a charm for me. (Play 2.3.x / Ebean-ORM)
You might want to look into constraint composition. You would build one annotation per password constraint composed from the @Pattern annotation, and then finally build one composed annotation using the previously defined four. This would require no extra java code.
http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html_single/#validator-customconstraints-compound
Otherwise, build (with accompanying java code) a custom annotation called @PasswordValidator.
I tend to like composed validators, as it makes the purpose of the validation annotations clear on their purpose, instead of having many disjoint annotations.
I modified Gunnar answer and write composite constraint and this now seems to work correctly on 4 unit tests: