I’m trying to retrieve a default validation error-message using MessageSource
. The code I’m working with uses reflection to retrieve the value of the message
parameter. On a constraint that does not override the message
parameter, I would like to retrieve the default error message. When I invoke the message
method on the validation annotation, I get {org.hibernate.validator.constraints.NotBlank.message}
(for example, for the @NotBlank
annotation). I then tried to use MessageSource
to get the error message like so:
String message = messageSource.getMessage(key, null, Locale.US);
I tried setting key
to {org.hibernate.validator.constraints.NotBlank.message}
, org.hibernate.validator.constraints.NotBlank.message
(removed braces) and even org.hibernate.validator.constraints.NotBlank
but I keep getting null
. What am I doing wrong here?
UPDATE
A clarification. I am under the impression that Spring comes with a default message.properties
file for its constraints. Am I correct in this assumption?
UPDATE
Changing the name of the question to better reflect what I was trying to do.
Advertisement
Answer
After running into a blog post from one of the Hibernate guys, and after digging around in the Hibernate Validator source, I think I’ve figured it out:
public String getMessage(final Locale locale, final String key) { PlatformResourceBundleLocator bundleLocator = new PlatformResourceBundleLocator("org.hibernate.validator.ValidationMessages"); ResourceBundle resourceBundle = bundleLocator.getResourceBundle(locale); try { final String k = key.replace("{", "").replace("}", ""); return resourceBundle.getString(k); } catch (MissingResourceException e) { return key; } }
So first, you have to instantiate a PlatformResourceBundleLocator
with the default validation messages. Then you retrieve a ResourceBundle
from the locator and use that to get your message. I don’t believe this performs any interpolation though. For that you have to use an interpolator; the blog post I linked to above goes into more detail about that.
UPDATE
Another (easier) way is to update your applicationContext.xml
and do this:
<bean id="resourceBundleSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>org.hibernate.validator.ValidationMessages</value> </list> </property> </bean>
Now your MessageSource
is populated with the default messages and you can do messageSource.getMessage()
. In fact, this is probably the best way.