package org.sample; import java.util.Locale; import java.util.ResourceBundle; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.MessageInterpolator; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import org.hibernate.validator.engine.MessageInterpolatorContext; import com.javaconcurrencyinpractice.annotations.ThreadSafe; @ThreadSafe public final class BeanValidator { private static final BeanValidator instance = new BeanValidator(); private final ValidatorFactory validatorFactory; public static BeanValidator getInstance() { return instance; } private BeanValidator() { MessageInterpolator messageInterpolator = new ExtendedResourceBundleMessageInterpolator(); validatorFactory = Validation.byDefaultProvider().configure().messageInterpolator(messageInterpolator).buildValidatorFactory(); } private ValidatorFactory getValidatorFactory() { return validatorFactory; } public Validator getValidator() { return getValidatorFactory().getValidator(); } /** * Validates a value (property) as indicated by annotations on the domain class * * @param clazz * @param propertyName * @param newValue * @param groups * @return the validation errors */ public Set validateValue(Class clazz, String propertyName, Object newValue, Class... groups) { return getValidator().validateValue(clazz, propertyName, newValue, groups); } /** * bean The object to validate * groups */ public Set> validateBean(Object bean, Class... groups) { return getValidator().validate(bean, groups); } public String getValidationMessage(ConstraintViolation constraintViolation, Locale locale) { MessageInterpolatorContext ctx = new ExtendedMessageInterpolatorContext(constraintViolation.getConstraintDescriptor(), constraintViolation.getLeafBean(), constraintViolation); ResourceBundle validationMessageResourceBundle = ResourceBundle.getBundle("ValidationMessages", locale, Thread.currentThread().getContextClassLoader()); MessageInterpolator msgInterpolator = new ExtendedResourceBundleMessageInterpolator(validationMessageResourceBundle); String violationMessage = msgInterpolator.interpolate(constraintViolation.getMessageTemplate(), ctx); return violationMessage; } }