The compiler ignored the message a constraint declares and always wrote its
own, so a failed @Pattern answered the caller with a regex. It now uses the
annotation's message whenever one is set, and keeps the plain description for
jakarta's default, which is a resource bundle key and not something to put in
front of whoever sent the request.
This is what makes moving a check out of a service and onto the type it
belongs to cost nothing: the wording moves with it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>