diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/ValidationContext.java b/engine/src/main/java/org/hibernate/validator/internal/engine/ValidationContext.java index d3a58aa3f8..2df1588d75 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/engine/ValidationContext.java +++ b/engine/src/main/java/org/hibernate/validator/internal/engine/ValidationContext.java @@ -31,6 +31,7 @@ import javax.validation.ParameterNameProvider; import javax.validation.Path; import javax.validation.TraversableResolver; +import javax.validation.ValidationException; import javax.validation.metadata.ConstraintDescriptor; import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl; @@ -40,6 +41,8 @@ import org.hibernate.validator.internal.metadata.BeanMetaDataManager; import org.hibernate.validator.internal.metadata.raw.ExecutableElement; import org.hibernate.validator.internal.util.IdentitySet; +import org.hibernate.validator.internal.util.logging.Log; +import org.hibernate.validator.internal.util.logging.LoggerFactory; import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList; import static org.hibernate.validator.internal.util.CollectionHelper.newHashMap; @@ -57,6 +60,8 @@ */ public class ValidationContext { + private static final Log log = LoggerFactory.make(); + /** * Access to the cached bean meta data */ @@ -415,13 +420,10 @@ public String toString() { public ConstraintViolation createConstraintViolation(ValueContext localContext, MessageAndPath messageAndPath, ConstraintDescriptor descriptor) { String messageTemplate = messageAndPath.getMessage(); - String interpolatedMessage = messageInterpolator.interpolate( + String interpolatedMessage = interpolate( messageTemplate, - new MessageInterpolatorContext( - descriptor, - localContext.getCurrentValidatedValue(), - getRootBeanClass() - ) + localContext.getCurrentValidatedValue(), + descriptor ); Path path = messageAndPath.getPath(); @@ -468,6 +470,27 @@ else if ( executableReturnValue != null ) { } } + private String interpolate(String messageTemplate, Object validatedValue, ConstraintDescriptor descriptor) { + MessageInterpolatorContext context = new MessageInterpolatorContext( + descriptor, + validatedValue, + getRootBeanClass() + ); + + try { + return messageInterpolator.interpolate( + messageTemplate, + context + ); + } + catch ( ValidationException ve ) { + throw ve; + } + catch ( Exception e ) { + throw log.getExceptionOcurredDuringMessageInterpolationException( e ); + } + } + private boolean isAlreadyValidatedForPath(Object value, PathImpl path) { Set pathSet = processedPaths.get( value ); if ( pathSet == null ) { diff --git a/engine/src/main/java/org/hibernate/validator/internal/util/logging/Log.java b/engine/src/main/java/org/hibernate/validator/internal/util/logging/Log.java index 50c97fe38b..cb33a60ff5 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/util/logging/Log.java +++ b/engine/src/main/java/org/hibernate/validator/internal/util/logging/Log.java @@ -536,4 +536,7 @@ public interface Log extends BasicLogger { @LogMessage(level = WARN) @Message(id = 148, value = "An exception ocurred during evaluation of EL expression '%s'") void evaluatingExpressionLanguageExpressionCausedException(String expression, @Cause Exception e); + + @Message(id = 149, value = "An exception occured during message interpolation") + ValidationException getExceptionOcurredDuringMessageInterpolationException(@Cause Exception e); }