You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bval.apache.org by mb...@apache.org on 2018/03/23 21:10:54 UTC

[1/3] bval git commit: update javadoc

Repository: bval
Updated Branches:
  refs/heads/bv2 d11c6d359 -> 7b3c58e00


update javadoc


Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/33e84f3c
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/33e84f3c
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/33e84f3c

Branch: refs/heads/bv2
Commit: 33e84f3c986d84e1d82e0f956c63d10419fcf685
Parents: d11c6d3
Author: Matt Benson <mb...@apache.org>
Authored: Fri Mar 23 14:36:30 2018 -0500
Committer: Matt Benson <mb...@apache.org>
Committed: Fri Mar 23 14:36:30 2018 -0500

----------------------------------------------------------------------
 bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/33e84f3c/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java b/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
index ba3fee8..94073c5 100644
--- a/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
+++ b/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
@@ -23,7 +23,7 @@ import java.util.function.Supplier;
 import java.util.stream.Stream;
 
 /**
- * Utility class for the creation and throwing of Exceptions.
+ * Utility class for sundry {@link Exception}-related tasks.
  */
 public class Exceptions {
 


[2/3] bval git commit: ws

Posted by mb...@apache.org.
ws


Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/2af2f5a2
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/2af2f5a2
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/2af2f5a2

Branch: refs/heads/bv2
Commit: 2af2f5a25677e8292cebb4f31f171a1cad1ec52f
Parents: 33e84f3
Author: Matt Benson <mb...@apache.org>
Authored: Fri Mar 23 16:00:55 2018 -0500
Committer: Matt Benson <mb...@apache.org>
Committed: Fri Mar 23 16:00:55 2018 -0500

----------------------------------------------------------------------
 bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/2af2f5a2/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java b/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
index 2b08fe6..fa230f9 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/BValAnnotatedType.java
@@ -94,6 +94,5 @@ public class BValAnnotatedType<A> implements AnnotatedType<A> {
         public String toString() {
             return String.format("@%s()", BValBinding.class.getName());
         }
-
     }
 }


[3/3] bval git commit: improve efficiency of generated exceptions/messages

Posted by mb...@apache.org.
improve efficiency of generated exceptions/messages


Project: http://git-wip-us.apache.org/repos/asf/bval/repo
Commit: http://git-wip-us.apache.org/repos/asf/bval/commit/7b3c58e0
Tree: http://git-wip-us.apache.org/repos/asf/bval/tree/7b3c58e0
Diff: http://git-wip-us.apache.org/repos/asf/bval/diff/7b3c58e0

Branch: refs/heads/bv2
Commit: 7b3c58e005f8a4741e34bab510fa97d36ba8c8c9
Parents: 2af2f5a
Author: Matt Benson <mb...@apache.org>
Authored: Fri Mar 23 16:10:44 2018 -0500
Committer: Matt Benson <mb...@apache.org>
Committed: Fri Mar 23 16:10:44 2018 -0500

----------------------------------------------------------------------
 .../jsr/ConstraintAnnotationAttributes.java     |  5 ++-
 .../org/apache/bval/jsr/ConstraintCached.java   |  9 ++--
 .../bval/jsr/ConstraintViolationImpl.java       |  4 +-
 .../ComputeConstraintValidatorClass.java        | 23 +++++-----
 .../apache/bval/jsr/descriptor/ConstraintD.java | 24 ++++++----
 .../jsr/descriptor/ContainerElementTypeD.java   |  7 +--
 .../bval/jsr/descriptor/MetadataReader.java     | 47 +++++++++++---------
 .../apache/bval/jsr/groups/GroupsComputer.java  |  7 ++-
 .../jsr/job/ConstraintValidatorContextImpl.java |  8 ++--
 .../apache/bval/jsr/job/ValidateProperty.java   | 25 ++++++-----
 .../bval/jsr/job/ValidateReturnValue.java       |  6 +--
 .../org/apache/bval/jsr/job/ValidationJob.java  | 27 ++++++-----
 .../bval/jsr/metadata/CompositeBuilder.java     | 18 +++++---
 .../bval/jsr/metadata/ContainerElementKey.java  |  7 +--
 .../bval/jsr/metadata/HierarchyBuilder.java     |  7 +--
 .../org/apache/bval/jsr/metadata/Liskov.java    |  4 +-
 .../bval/jsr/metadata/ReflectionBuilder.java    | 11 +++--
 .../jsr/metadata/ValidatorMappingProvider.java  |  8 ++--
 .../apache/bval/jsr/metadata/XmlBuilder.java    |  7 +--
 .../bval/jsr/util/AnnotationsManager.java       | 22 ++++-----
 .../apache/bval/jsr/util/ExecutableTypes.java   |  6 ++-
 .../java/org/apache/bval/jsr/util/NodeImpl.java |  2 +-
 .../jsr/valueextraction/ValueExtractors.java    |  6 +--
 .../apache/bval/jsr/xml/AnnotationProxy.java    |  7 +--
 .../java/org/apache/bval/util/Exceptions.java   | 44 ++++++++++++++++++
 .../java/org/apache/bval/util/Validate.java     |  6 ++-
 26 files changed, 215 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java
index f40e301..d9a1c69 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintAnnotationAttributes.java
@@ -126,8 +126,9 @@ public enum ConstraintAnnotationAttributes {
     public <V> V get(Map<? super String, ? super V> map) {
         @SuppressWarnings("unchecked")
         final V result = (V) map.get(getAttributeName());
-        Exceptions.raiseUnless(TypeUtils.isInstance(result, getType()), IllegalStateException::new,
-            "Invalid '%s' value: %s", getAttributeName(), result);
+        if (!TypeUtils.isInstance(result, getType())) {
+            Exceptions.raise(IllegalStateException::new, "Invalid '%s' value: %s", getAttributeName(), result);
+        }
         return result;
     }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java
index faa9144..fa9e3df 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintCached.java
@@ -24,13 +24,11 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import javax.validation.ConstraintDefinitionException;
 import javax.validation.ConstraintValidator;
@@ -44,7 +42,6 @@ import org.apache.bval.jsr.metadata.ValidatorMappingProvider;
 import org.apache.bval.jsr.util.ToUnmodifiable;
 import org.apache.bval.util.Exceptions;
 import org.apache.bval.util.Lazy;
-import org.apache.bval.util.ObjectUtils;
 import org.apache.bval.util.Validate;
 
 /**
@@ -73,8 +70,10 @@ public class ConstraintCached {
             supportedTargets = svt == null ? DEFAULT_VALIDATION_TARGETS
                 : Collections.unmodifiableSet(EnumSet.copyOf(Arrays.asList(svt.value())));
 
-            Exceptions.raiseIf(supportedTargets.isEmpty(), ConstraintDefinitionException::new,
-                "Illegally specified 0-length %s value on %s", SupportedValidationTarget.class.getSimpleName(), type);
+            if (supportedTargets.isEmpty()) {
+                Exceptions.raise(ConstraintDefinitionException::new, "Illegally specified 0-length %s value on %s",
+                    SupportedValidationTarget.class.getSimpleName(), type);
+            }
         }
 
         public Class<? extends ConstraintValidator<T, ?>> getType() {

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java
index 15f754d..2bf6d3b 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/ConstraintViolationImpl.java
@@ -172,7 +172,9 @@ public class ConstraintViolationImpl<T> implements ConstraintViolation<T>, Seria
 
     @Override
     public <U> U unwrap(Class<U> type) {
-        Exceptions.raiseUnless(type.isInstance(this), ValidationException::new, "Type %s is not supported", type);
+        if (!type.isInstance(this)) {
+            Exceptions.raise(ValidationException::new, "Type %s is not supported", type);
+        }
         return type.cast(this);
     }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java
index d2595ea..820a1d8 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ComputeConstraintValidatorClass.java
@@ -64,7 +64,7 @@ class ComputeConstraintValidatorClass<A extends Annotation>
             this.arrayDepth = d;
         }
 
-        Class<?> unwrap(Class<?> t) {
+        Class<?> unwrapArrayComponentType(Class<?> t) {
             Exceptions.raiseUnless(t.isAssignableFrom(componentType), IllegalArgumentException::new,
                 "%s not assignable from %s", t, componentType);
             if (arrayDepth == 0) {
@@ -80,8 +80,10 @@ class ComputeConstraintValidatorClass<A extends Annotation>
     private static Class<?> getValidatedType(Class<? extends ConstraintValidator<?, ?>> validatorType) {
         final Type result = TypeUtils.getTypeArguments(validatorType, ConstraintValidator.class)
             .get(ConstraintValidator.class.getTypeParameters()[1]);
-        Exceptions.raiseUnless(isSupported(result), ConstraintDefinitionException::new,
-            "Validated type %s declared by %s %s is unsupported", result, CV, validatorType.getName());
+        if (!isSupported(result)) {
+            Exceptions.raise(ConstraintDefinitionException::new, "Validated type %s declared by %s %s is unsupported",
+                result, CV, validatorType.getName());
+        }
         return TypeUtils.getRawType(result, null);
     }
 
@@ -140,14 +142,15 @@ class ComputeConstraintValidatorClass<A extends Annotation>
         @SuppressWarnings("unchecked")
         final Class<A> constraintType = (Class<A>) constraint.annotationType();
 
-        Exceptions.raiseIf(set.size() > 1 || !composed && set.isEmpty(), ConstraintDefinitionException::new,
-            "%d cross-parameter %ss found for constraint type %s", set.size(), CV, constraintType);
+        final int size = set.size();
+        Exceptions.raiseIf(size > 1 || !composed && set.isEmpty(), ConstraintDefinitionException::new,
+            "%d cross-parameter %ss found for constraint type %s", size, CV, constraintType);
 
         final Class<? extends ConstraintValidator<A, ?>> result = set.iterator().next().getType();
-        Exceptions.raiseUnless(TypeUtils.isAssignable(Object[].class, getValidatedType(result)),
-            ConstraintDefinitionException::new,
-            "Cross-parameter %s %s does not support the validation of an object array", CV, result.getName());
-
+        if (!TypeUtils.isAssignable(Object[].class, getValidatedType(result))) {
+            Exceptions.raise(ConstraintDefinitionException::new,
+                "Cross-parameter %s %s does not support the validation of an object array", CV, result.getName());
+        }
         return result;
     }
 
@@ -199,6 +202,6 @@ class ComputeConstraintValidatorClass<A extends Annotation>
         final TypeWrapper w = new TypeWrapper(Reflection.primitiveToWrapper(validatedType));
         Stream.Builder<Class<?>> hierarchy = Stream.builder();
         Reflection.hierarchy(w.componentType, Interfaces.INCLUDE).forEach(hierarchy);
-        return hierarchy.build().map(w::unwrap);
+        return hierarchy.build().map(w::unwrapArrayComponentType);
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
index 8dd6db9..16007c5 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ConstraintD.java
@@ -197,7 +197,8 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A
             Optional.of(constraintType).map(attr::analyze).filter(Worker::isValid).map(w -> w.<T> read(annotation));
 
         Exceptions.raiseUnless(optionality.isOptional() || result.isPresent(), ConstraintDefinitionException::new,
-            "Required attribute %s missing from constraint type %s", attr.getAttributeName(), constraintType);
+            "Required attribute %s missing from constraint type %s",
+            f -> f.args(attr.getAttributeName(), constraintType));
 
         return result.orElse(null);
     }
@@ -237,18 +238,21 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A
     private Set<Class<? extends Payload>> computePayload() {
         final Set<Class<? extends Payload>> result =
             set(() -> read(ConstraintAnnotationAttributes.PAYLOAD, Optionality.REQUIRED));
-        Exceptions.raiseIf(result.containsAll(Arrays.asList(Unwrapping.Unwrap.class, Unwrapping.Skip.class)),
-            ConstraintDeclarationException::new,
-            "Constraint %s declared at %s specifies conflicting value unwrapping hints", annotation, meta.getHost());
+        if (result.containsAll(Arrays.asList(Unwrapping.Unwrap.class, Unwrapping.Skip.class))) {
+            Exceptions.raise(ConstraintDeclarationException::new,
+                "Constraint %s declared at %s specifies conflicting value unwrapping hints", annotation,
+                meta.getHost());
+        }
         return result;
     }
 
     private Class<?> computeValidatedType(ApacheValidatorFactory validatorFactory) {
         final Class<?> rawType = TypeUtils.getRawType(meta.getType(), null);
 
-        Exceptions.raiseIf(rawType == null, UnexpectedTypeException::new, "Could not calculate validated type from %s",
-            meta.getType());
-
+        if (rawType == null) {
+            Exceptions.raise(UnexpectedTypeException::new, "Could not calculate validated type from %s",
+                meta.getType());
+        }
         if (payload.contains(Unwrapping.Skip.class)) {
             return rawType;
         }
@@ -258,8 +262,10 @@ public class ConstraintD<A extends Annotation> implements ConstraintDescriptor<A
         final boolean unwrap = payload.contains(Unwrapping.Unwrap.class);
 
         if (valueExtractor == null) {
-            Exceptions.raiseIf(unwrap, ConstraintDeclarationException::new, "No compatible %s found for %s",
-                ValueExtractor.class.getSimpleName(), meta.getType());
+            if (unwrap) {
+                Exceptions.raise(ConstraintDeclarationException::new, "No compatible %s found for %s",
+                    ValueExtractor.class.getSimpleName(), meta.getType());
+            }
         } else {
             @SuppressWarnings("unchecked")
             final Class<? extends ValueExtractor<?>> extractorClass =

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java
index f8abed2..ef00edc 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/ContainerElementTypeD.java
@@ -59,9 +59,10 @@ public class ContainerElementTypeD extends CascadableContainerD<CascadableContai
     @Override
     protected Stream<GraphContext> readImpl(GraphContext context) throws Exception {
         final ValueExtractor<?> valueExtractor = context.getValidatorContext().getValueExtractors().find(key);
-        Exceptions.raiseIf(valueExtractor == null, ConstraintDeclarationException::new, "No %s found for %s",
-            ValueExtractor.class.getSimpleName(), key);
-
+        if (valueExtractor == null) {
+            Exceptions.raise(ConstraintDeclarationException::new, "No %s found for %s",
+                ValueExtractor.class.getSimpleName(), key);
+        }
         return ExtractValues.extract(context, key, valueExtractor).stream();
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
index 83055a9..beb0648 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/descriptor/MetadataReader.java
@@ -105,9 +105,9 @@ class MetadataReader {
             beanBuilder.getGetters(meta).forEach((g, builder) -> {
                 final Method getter = Methods.getter(meta.getHost(), g);
 
-                Exceptions.raiseIf(getter == null, IllegalStateException::new,
-                    "Getter method for property %s not found", g);
-
+                if (getter == null) {
+                    Exceptions.raise(IllegalStateException::new, "Getter method for property %s not found", g);
+                }
                 properties.computeIfAbsent(g, descriptorList).add(new PropertyD.ForMethod(
                     new MetadataReader.ForContainer<>(new Meta.ForMethod(getter), builder), parent));
             });
@@ -173,27 +173,31 @@ class MetadataReader {
 
         List<Class<?>> getGroupSequence() {
             List<Class<?>> result = builder.getGroupSequence(meta);
+            final Class<T> host = meta.getHost();
             if (result == null) {
                 // resolve group sequence/Default redefinition up class hierarchy:
-                final Class<?> superclass = meta.getHost().getSuperclass();
+                final Class<?> superclass = host.getSuperclass();
                 if (superclass != null) {
                     // attempt to mock parent sequence intent by appending this type immediately after supertype:
                     result = ((ElementD<?, ?>) validatorFactory.getDescriptorManager().getBeanDescriptor(superclass))
                         .getGroupSequence();
                     if (result != null) {
                         result = new ArrayList<>(result);
-                        result.add(result.indexOf(superclass) + 1, meta.getHost());
+                        result.add(result.indexOf(superclass) + 1, host);
                     }
                 }
             }
             if (result == null) {
                 return null;
             }
-            Exceptions.raiseUnless(result.contains(meta.getHost()), GroupDefinitionException::new,
-                "@%s for %s must contain %<s", GroupSequence.class.getSimpleName(), meta.getHost());
-            Exceptions.raiseIf(result.contains(Default.class), GroupDefinitionException::new,
-                "@%s for %s must not contain %s", GroupSequence.class.getSimpleName(), meta.getHost(),
-                Default.class.getName());
+            if (!result.contains(host)) {
+                Exceptions.raise(GroupDefinitionException::new, "@%s for %s must contain %<s",
+                    GroupSequence.class.getSimpleName(), host);
+            }
+            if (result.contains(Default.class)) {
+                Exceptions.raise(GroupDefinitionException::new, "@%s for %s must not contain %s",
+                    GroupSequence.class.getSimpleName(), host, Default.class.getName());
+            }
             return Collections.unmodifiableList(result);
         }
     }
@@ -211,20 +215,19 @@ class MetadataReader {
         Set<GroupConversion> getGroupConversions() {
             final Set<GroupConversion> groupConversions = builder.getGroupConversions(meta);
             if (!groupConversions.isEmpty()) {
-                Exceptions.raiseUnless(isCascaded(), ConstraintDeclarationException::new,
-                    "@%s declared without @%s on %s", ConvertGroup.class.getSimpleName(), Valid.class.getSimpleName(),
-                    meta.describeHost());
-
-                Exceptions.raiseIf(
-                    groupConversions.stream().map(GroupConversion::getFrom).distinct().count() < groupConversions
-                        .size(),
-                    ConstraintDeclarationException::new, "%s has duplicate 'from' group conversions",
-                    meta.describeHost());
-
+                if (!isCascaded()) {
+                    Exceptions.raise(ConstraintDeclarationException::new, "@%s declared without @%s on %s",
+                        ConvertGroup.class.getSimpleName(), Valid.class.getSimpleName(), meta.describeHost());
+                }
+                if (groupConversions.stream().map(GroupConversion::getFrom).distinct().count() < groupConversions
+                    .size()) {
+                    Exceptions.raise(ConstraintDeclarationException::new, "%s has duplicate 'from' group conversions",
+                        meta.describeHost());
+                }
                 groupConversions.stream().map(GroupConversion::getFrom)
-                    .forEach(f -> Exceptions.raiseIf(f.isAnnotationPresent(GroupSequence.class),
+                    .forEach(from -> Exceptions.raiseIf(from.isAnnotationPresent(GroupSequence.class),
                         ConstraintDeclarationException::new,
-                        "Invalid group conversion declared on %s from group sequence %s", meta.describeHost(), f));
+                        "Invalid group conversion declared on %s from group sequence %s", f -> f.args(meta.describeHost(), from)));
             }
             return groupConversions;
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java b/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java
index 8f4cdda..30a47cd 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/groups/GroupsComputer.java
@@ -137,10 +137,9 @@ public class GroupsComputer {
         Exceptions.raiseIf(groups.stream().anyMatch(Objects::isNull), IllegalArgumentException::new,
             "Null group specified");
 
-        for (final Class<?> clazz : groups) {
-            Exceptions.raiseUnless(clazz.isInterface(), ValidationException::new,
-                "A group must be an interface. %s is not.", clazz);
-        }
+        groups.forEach(g -> Exceptions.raiseUnless(g.isInterface(), ValidationException::new,
+            "A group must be an interface. %s is not.", g));
+
         final Groups chain = new Groups();
         for (Class<?> clazz : groups) {
             final GroupSequence anno = clazz.getAnnotation(GroupSequence.class);

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
index 6d4ca98..07c0c96 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ConstraintValidatorContextImpl.java
@@ -82,7 +82,7 @@ public class ConstraintValidatorContextImpl<T> implements ConstraintValidatorCon
         @Override
         public NodeBuilderDefinedContext addParameterNode(int index) {
             Exceptions.raiseUnless(frame.descriptor instanceof CrossParameterDescriptor, ValidationException::new,
-                "Cannot add parameter node for %s", frame.descriptor.getClass().getName());
+                "Cannot add parameter node for %s", f -> f.args(frame.descriptor.getClass().getName()));
 
             final CrossParameterD<?, ?> crossParameter =
                 ComposedD.unwrap(frame.descriptor, CrossParameterD.class).findFirst().get();
@@ -175,9 +175,9 @@ public class ConstraintValidatorContextImpl<T> implements ConstraintValidatorCon
 
     Set<ConstraintViolation<T>> getRequiredViolations() {
         if (!violations.optional().isPresent()) {
-            Exceptions.raiseIf(defaultConstraintViolationDisabled, ValidationException::new,
-                "Expected custom constraint violation(s)");
-
+            if (defaultConstraintViolationDisabled) {
+                Exceptions.raise(ValidationException::new, "Expected custom constraint violation(s)");
+            }
             addError(getDefaultConstraintMessageTemplate(), frame.context.getPath());
         }
         return violations.get();

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
index fa7e0f5..ce33840 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateProperty.java
@@ -200,8 +200,10 @@ public final class ValidateProperty<T> extends ValidationJob<T> {
                 bean = (BeanD<?>) validatorContext.getDescriptorManager().getBeanDescriptor(element.getElementClass());
             }
             final PropertyDescriptor property = bean.getProperty(name);
-            Exceptions.raiseIf(property == null, IllegalArgumentException::new, "Unknown property %s of %s", name,
-                bean.getElementClass());
+            if (property == null) {
+                Exceptions.raise(IllegalArgumentException::new, "Unknown property %s of %s", name,
+                    bean.getElementClass());
+            }
             current = new DescriptorWrapper(property);
         }
 
@@ -259,11 +261,8 @@ public final class ValidateProperty<T> extends ValidationJob<T> {
                     Optional.ofNullable(TypeUtils.getTypeArguments(type, Iterable.class).get(ITERABLE_ELEMENT))
                         .orElse(ITERABLE_ELEMENT);
             } else {
-                elementType = null;
+                throw Exceptions.create(IllegalArgumentException::new, "Unable to resolve element type of %s", type);
             }
-            Exceptions.raiseIf(elementType == null, IllegalArgumentException::new,
-                "Unable to resolve element type of %s", type);
-
             return new TypeWrapper(validatorContext, elementType);
         }
 
@@ -380,7 +379,9 @@ public final class ValidateProperty<T> extends ValidationJob<T> {
             } else {
                 try {
                     final int index = Integer.parseInt(indexOrKey);
-                    Exceptions.raiseIf(index < 0, IllegalArgumentException::new, "Invalid index %d", index);
+                    if (index < 0) {
+                        Exceptions.raise(IllegalArgumentException::new, "Invalid index %d", index);
+                    }
                     if (o != null && TypeUtils.isArrayType(o.getClass())) {
                         if (Array.getLength(o) > index) {
                             return Array.get(o, index);
@@ -478,8 +479,9 @@ public final class ValidateProperty<T> extends ValidationJob<T> {
             descriptor = (ElementD<?, ?>) validatorContext.getDescriptorManager().getBeanDescriptor(t);
         } else {
             final Class<?> propertyType = descriptor.getElementClass();
-            Exceptions.raiseUnless(TypeUtils.isInstance(value, propertyType), IllegalArgumentException::new,
-                "%s is not an instance of %s", value, propertyType);
+            if (!TypeUtils.isInstance(value, propertyType)) {
+                Exceptions.raise(IllegalArgumentException::new, "%s is not an instance of %s", value, propertyType);
+            }
         }
     }
 
@@ -489,8 +491,9 @@ public final class ValidateProperty<T> extends ValidationJob<T> {
         this(new ForBeanProperty<>(validatorContext, bean), validatorContext,
             (Class<T>) Validate.notNull(bean, IllegalArgumentException::new, "bean").getClass(), property, groups);
 
-        Exceptions.raiseIf(descriptor == null, IllegalArgumentException::new,
-            "Could not resolve property name/path: %s", property);
+        if (descriptor == null) {
+            Exceptions.raise(IllegalArgumentException::new, "Could not resolve property name/path: %s", property);
+        }
     }
 
     public ValidateProperty<T> cascade(boolean cascade) {

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java
index d477b72..8ffd5f5 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidateReturnValue.java
@@ -103,9 +103,9 @@ public abstract class ValidateReturnValue<E extends Executable, T> extends Valid
         super(validatorContext, groups, meta);
 
         final Type type = Validate.notNull(meta, IllegalArgumentException::new, "meta").getType();
-        Exceptions.raiseUnless(TypeUtils.isInstance(returnValue, type), IllegalArgumentException::new,
-            "%s is not an instance of %s", returnValue, type);
-
+        if (!TypeUtils.isInstance(returnValue, type)) {
+            Exceptions.raise(IllegalArgumentException::new, "%s is not an instance of %s", returnValue, type);
+        }
         this.returnValue = returnValue;
     }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
index a55b9b7..0501a8a 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/job/ValidationJob.java
@@ -148,13 +148,15 @@ public abstract class ValidationJob<T> {
                     .ifPresent(x -> m.put(genericKey, x));
             }
             if (m.isEmpty()) {
-                Exceptions.raiseIf(valueUnwrapping == ValidateUnwrappedValue.UNWRAP,
-                    ConstraintDeclarationException::new, "No %s found for %s", containerClass);
+                if (valueUnwrapping == ValidateUnwrappedValue.UNWRAP) {
+                    Exceptions.raise(ConstraintDeclarationException::new, "No %s found for %s", containerClass);
+                }
                 return Optional.empty();
             }
-            Exceptions.raiseIf(m.size() > 1, ConstraintDeclarationException::new,
-                "Found generic and non-generic %ss for %s", ValueExtractor.class.getSimpleName(), containerClass);
-
+            if (m.size() > 1) {
+                Exceptions.raise(ConstraintDeclarationException::new, "Found generic and non-generic %ss for %s",
+                    ValueExtractor.class.getSimpleName(), containerClass);
+            }
             return Optional.of(m.entrySet().iterator().next());
         }
 
@@ -231,9 +233,10 @@ public abstract class ValidationJob<T> {
                 constraint.getConstraintValidatorClass();
 
             if (constraintValidatorClass == null) {
-                Exceptions.raiseIf(constraint.getComposingConstraints().isEmpty(), UnexpectedTypeException::new,
-                    "No %s type located for non-composed constraint %s", ConstraintValidator.class.getSimpleName(),
-                    constraint);
+                if (constraint.getComposingConstraints().isEmpty()) {
+                    Exceptions.raise(UnexpectedTypeException::new, "No %s type located for non-composed constraint %s",
+                        ConstraintValidator.class.getSimpleName(), constraint);
+                }
                 return null;
             }
             ConstraintValidator constraintValidator = null;
@@ -244,10 +247,10 @@ public abstract class ValidationJob<T> {
             } catch (Exception e) {
                 cause = e;
             }
-            Exceptions.raiseIf(constraintValidator == null, ValidationException::new, cause,
-                "Unable to get %s instance from %s", constraintValidatorClass.getName(),
-                validatorContext.getConstraintValidatorFactory());
-
+            if (constraintValidator == null) {
+                Exceptions.raise(ValidationException::new, cause, "Unable to get %s instance from %s",
+                    constraintValidatorClass.getName(), validatorContext.getConstraintValidatorFactory());
+            }
             return constraintValidator;
         }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java
index d8ac834..42d681f 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/CompositeBuilder.java
@@ -100,8 +100,9 @@ public class CompositeBuilder {
         public Map<String, MetadataBuilder.ForContainer<Field>> getFields(Meta<Class<T>> meta) {
             return merge(b -> b.getFields(meta), (f, l) -> {
                 final Field fld = Reflection.find(meta.getHost(), t -> Reflection.getDeclaredField(t, f));
-                Exceptions.raiseIf(fld == null, IllegalStateException::new, "Could not find field %s of %s", f,
-                    meta.getHost());
+                if (fld == null) {
+                    Exceptions.raise(IllegalStateException::new, "Could not find field %s of %s", f, meta.getHost());
+                }
                 return forContainer(l, new Meta.ForField(fld), ElementKind.PROPERTY);
             });
         }
@@ -110,8 +111,10 @@ public class CompositeBuilder {
         public Map<String, MetadataBuilder.ForContainer<Method>> getGetters(Meta<Class<T>> meta) {
             return merge(b -> b.getGetters(meta), (g, l) -> {
                 final Method getter = Methods.getter(meta.getHost(), g);
-                Exceptions.raiseIf(getter == null, IllegalStateException::new,
-                    "Could not find getter for property %s of %s", g, meta.getHost());
+                if (getter == null) {
+                    Exceptions.raise(IllegalStateException::new, "Could not find getter for property %s of %s", g,
+                        meta.getHost());
+                }
                 return forContainer(l, new Meta.ForMethod(getter), ElementKind.PROPERTY);
             });
         }
@@ -252,9 +255,10 @@ public class CompositeBuilder {
         final List<String> parameterNames =
             getParameterNames.apply(validatorFactory.getParameterNameProvider(), meta.getHost());
 
-        Exceptions.raiseUnless(parameterNames.size() == parameters.length, IllegalStateException::new,
-            "%s returned wrong number of parameter names", validatorFactory.getParameterNameProvider());
-
+        if (parameterNames.size() != parameters.length) {
+            Exceptions.raise(IllegalStateException::new, "%s returned wrong number of parameter names",
+                validatorFactory.getParameterNameProvider());
+        }
         return IntStream.range(0, parameters.length)
             .mapToObj(n -> new Meta.ForParameter(parameters[n], parameterNames.get(n))).collect(Collectors.toList());
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
index d7b5b18..529ccda 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java
@@ -61,9 +61,10 @@ public class ContainerElementKey implements Comparable<ContainerElementKey> {
 
                 if (containerType.isAnnotationPresent(ExtractedValue.class)) {
                     final Class<?> extractedType = containerType.getAnnotation(ExtractedValue.class).type();
-                    Exceptions.raiseIf(void.class.equals(extractedType), ValueExtractorDefinitionException::new,
-                        "%s does not specify %s type for %s", extractorType, ExtractedValue.class.getSimpleName(),
-                        containerType);
+                    if (void.class.equals(extractedType)) {
+                        Exceptions.raise(ValueExtractorDefinitionException::new, "%s does not specify %s type for %s",
+                            extractorType, ExtractedValue.class.getSimpleName(), containerType);
+                    }
                     result.get().add(new ContainerElementKey(containerType, null) {
                         public AnnotatedType getAnnotatedType() {
                             return EmulatedAnnotatedType.wrap(extractedType);

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java
index a028b59..4861c1a 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/HierarchyBuilder.java
@@ -237,9 +237,10 @@ public class HierarchyBuilder extends CompositeBuilder {
             }
             final List<Meta<Parameter>> metaParameters = getMetaParameters(hierarchyElement, getParameterNames);
 
-            Exceptions.raiseUnless(metaParameters.size() == parameterDelegates.size(), IllegalStateException::new,
-                "Got wrong number of parameter delegates for %s", meta.getHost());
-
+            if (metaParameters.size() != parameterDelegates.size()) {
+                Exceptions.raise(IllegalStateException::new, "Got wrong number of parameter delegates for %s",
+                    meta.getHost());
+            }
             return IntStream.range(0, parameterDelegates.size())
                 .mapToObj(n -> new ContainerDelegate<>(parameterDelegates.get(n), metaParameters.get(n)))
                 .collect(Collectors.toList());

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
index 3d168bc..956f937 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/Liskov.java
@@ -166,8 +166,8 @@ class Liskov {
             .stream().filter(Predicate.isEqual(t).negate()).anyMatch(t2 -> related(t, t2)));
 
         Exceptions.raiseIf(anyRelated, ConstraintDeclarationException::new,
-            "Multiple method return values marked @%s in hierarchy %s", Valid.class.getSimpleName(),
-            cascadedReturnValues.values());
+            "Multiple method return values marked @%s in hierarchy %s",
+            f -> f.args(Valid.class.getSimpleName(), cascadedReturnValues.values()));
     }
 
     @SafeVarargs

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
index 08b2b1d..419f961 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ReflectionBuilder.java
@@ -270,10 +270,13 @@ public class ReflectionBuilder {
                         }
                     } else {
                         target = impliedConstraintTarget();
-                        Exceptions.raiseIf(target == null, ConstraintDeclarationException::new,
-                            "Found %d possible %s types for constraint type %s and no explicit assignment via #%s()",
-                            supportedTargets.size(), ValidationTarget.class.getSimpleName(), constraintType.getName(),
-                            ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getAttributeName());
+                        if (target == null) {
+                            Exceptions.raise(ConstraintDeclarationException::new,
+                                "Found %d possible %s types for constraint type %s and no explicit assignment via #%s()",
+                                supportedTargets.size(), ValidationTarget.class.getSimpleName(),
+                                constraintType.getName(),
+                                ConstraintAnnotationAttributes.VALIDATION_APPLIES_TO.getAttributeName());
+                        }
                     }
                 }
                 result.computeIfAbsent(target, k -> new ArrayList<>()).add(constraint);

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java
index 8a8cd3f..e5c7d07 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ValidatorMappingProvider.java
@@ -38,9 +38,11 @@ public abstract class ValidatorMappingProvider {
                 final Type constraintParameter = TypeUtils.getTypeArguments(t, ConstraintValidator.class)
                     .get(ConstraintValidator.class.getTypeParameters()[0]);
 
-                Exceptions.raiseUnless(constraintType.equals(constraintParameter), ConstraintDefinitionException::new,
-                    "%s %s expected first type parameter of %s, %s; source %s", ConstraintValidator.class, t,
-                    constraintType, constraintParameter, result.get().getSource());
+                if (!constraintType.equals(constraintParameter)) {
+                    Exceptions.raise(ConstraintDefinitionException::new,
+                        "%s %s expected first type parameter of %s, %s; source %s", ConstraintValidator.class, t,
+                        constraintType, constraintParameter, result.get().getSource());
+                }
             }
             return result.get();
         }

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java
index a9cb7f4..7a08525 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/metadata/XmlBuilder.java
@@ -274,9 +274,10 @@ public class XmlBuilder {
                     return new ContainerElementKey(annotatedType, typeArgumentIndex);
                 }, XmlBuilder.ForContainerElementType::new));
             }
-            Exceptions.raiseUnless(elements.isEmpty(), ValidationException::new,
-                "Illegally specified %d container element type(s) for %s", elements.size(), host);
-
+            if (!elements.isEmpty()) {
+                Exceptions.raise(ValidationException::new, "Illegally specified %d container element type(s) for %s",
+                    elements.size(), host);
+            }
             return Collections.emptyMap();
         }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java b/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
index ea2cac5..a7262d0 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/AnnotationsManager.java
@@ -131,18 +131,19 @@ public class AnnotationsManager {
                     if (spec.impliesSingleComposingConstraint) {
                         Exceptions.raiseUnless(count == 1, ConstraintDefinitionException::new,
                             "Expected a single composing %s constraint", spec.annotationType);
-                    } else {
-                        Exceptions.raiseUnless(count > spec.constraintIndex, ConstraintDefinitionException::new,
+                    } else if (count <= spec.constraintIndex) {
+                        Exceptions.raise(ConstraintDefinitionException::new,
                             "Expected at least %s composing %s constraints", spec.constraintIndex + 1,
                             spec.annotationType);
                     }
                     final Map<String, String> attributeMapping =
                         overrides.get().computeIfAbsent(spec, k -> new HashMap<>());
 
-                    Exceptions.raiseIf(attributeMapping.containsKey(to), ConstraintDefinitionException::new,
-                        "Attempt to override %s#%s() index %d from multiple sources", overridesAttribute.constraint(),
-                        to, overridesAttribute.constraintIndex());
-
+                    if (attributeMapping.containsKey(to)) {
+                        Exceptions.raise(ConstraintDefinitionException::new,
+                            "Attempt to override %s#%s() index %d from multiple sources",
+                            overridesAttribute.constraint(), to, overridesAttribute.constraintIndex());
+                    }
                     attributeMapping.put(to, from);
                 }
             }
@@ -342,10 +343,11 @@ public class AnnotationsManager {
             final Composition result = new Composition(annotationType);
             Stream.of(result.components).map(Annotation::annotationType).forEach(at -> {
                 final Set<ValidationTarget> composingTargets = supportedTargets(at);
-                Exceptions.raiseIf(Collections.disjoint(composingTargets, composedTargets),
-                    ConstraintDefinitionException::new,
-                    "Attempt to compose %s of %s but validator types are incompatible", annotationType.getName(),
-                    at.getName());
+                if (Collections.disjoint(composingTargets, composedTargets)) {
+                    Exceptions.raise(ConstraintDefinitionException::new,
+                        "Attempt to compose %s of %s but validator types are incompatible", annotationType.getName(),
+                        at.getName());
+                }
             });
             return result;
         });

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java b/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java
index fed9d49..d94cd33 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/ExecutableTypes.java
@@ -57,8 +57,10 @@ public class ExecutableTypes {
             return ALL_TYPES;
         }
         if (result.remove(ExecutableType.IMPLICIT)) {
-            Exceptions.raiseUnless(result.isEmpty(), IllegalArgumentException::new,
-                "Mixing %s with other %ss is illegal.", ExecutableType.IMPLICIT, ExecutableType.class.getSimpleName());
+            if (!result.isEmpty()) {
+                Exceptions.raise(IllegalArgumentException::new, "Mixing %s with other %ss is illegal.",
+                    ExecutableType.IMPLICIT, ExecutableType.class.getSimpleName());
+            }
             return IMPLICIT_TYPES;
         }
         result.remove(ExecutableType.NONE);

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java b/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
index e8319f8..1d49a2a 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/util/NodeImpl.java
@@ -313,7 +313,7 @@ public abstract class NodeImpl implements Path.Node, Serializable {
     @Override
     public <T extends Node> T as(final Class<T> nodeType) {
         Exceptions.raiseUnless(nodeType.isInstance(this), ClassCastException::new, "Type %s not supported by %s",
-            nodeType, getClass());
+            f -> f.args(nodeType, getClass()));
         return nodeType.cast(this);
     }
 

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
index 3925943..632b9da 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/valueextraction/ValueExtractors.java
@@ -95,7 +95,7 @@ public class ValueExtractors {
                 .get(key.getContainerClass().getTypeParameters()[key.getTypeArgumentIndex().intValue()]);
         }
         Exceptions.raiseUnless(result instanceof Class<?>, ValueExtractorDefinitionException::new,
-            "%s did not resolve to a %s relative to %s", key, Class.class.getName(), target);
+            "%s did not resolve to a %s relative to %s", f -> f.args(key, Class.class.getName(), target));
         return (Class<?>) result;
     }
 
@@ -171,7 +171,7 @@ public class ValueExtractors {
         Validate.notNull(extractor);
         valueExtractors.get().compute(ContainerElementKey.forValueExtractor(extractor), (k, v) -> {
             Exceptions.raiseIf(v != null, ValueExtractorDeclarationException::new,
-                "Multiple context-level %ss specified for %s", ValueExtractor.class.getSimpleName(), k);
+                "Multiple context-level %ss specified for %s", f -> f.args(ValueExtractor.class.getSimpleName(), k));
             return extractor;
         });
     }
@@ -207,7 +207,7 @@ public class ValueExtractors {
                 .filter(Predicate.isEqual(quid).negate()).allMatch(quo -> related(quid, quo)));
 
             Exceptions.raiseUnless(allRelated, ConstraintDeclarationException::new,
-                "> 1 maximally specific %s found for %s", ValueExtractor.class.getSimpleName(), key);
+                "> 1 maximally specific %s found for %s", f -> f.args(ValueExtractor.class.getSimpleName(), key));
         }
         return candidateMap.values().iterator().next();
     }

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
index 13678ac..44d67b8 100644
--- a/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
+++ b/bval-jsr/src/main/java/org/apache/bval/jsr/xml/AnnotationProxy.java
@@ -64,14 +64,15 @@ class AnnotationProxy implements Annotation, InvocationHandler, Serializable {
                 values.put(m.getName(), descriptor.getValue(m.getName()));
                 processedValuesFromDescriptor++;
             } else {
-                Exceptions.raiseIf(m.getDefaultValue() == null, IllegalArgumentException::new,
-                    "No value provided for %s", m.getName());
+                if (m.getDefaultValue() == null) {
+                    Exceptions.raise(IllegalArgumentException::new, "No value provided for %s", m.getName());
+                }
                 values.put(m.getName(), m.getDefaultValue());
             }
         }
         Exceptions.raiseUnless(processedValuesFromDescriptor == descriptor.size() || Valid.class.equals(annotationType),
             IllegalArgumentException::new, "Trying to instantiate %s with unknown parameters.",
-            annotationType.getName());
+            f -> f.args(annotationType.getName()));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java b/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
index 94073c5..2e474c0 100644
--- a/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
+++ b/bval-jsr/src/main/java/org/apache/bval/util/Exceptions.java
@@ -18,6 +18,7 @@ package org.apache.bval.util;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.function.BiFunction;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
@@ -26,6 +27,17 @@ import java.util.stream.Stream;
  * Utility class for sundry {@link Exception}-related tasks.
  */
 public class Exceptions {
+    /**
+     * Callback interface that collects format arguments in conditional raise* method variants.
+     * @see Exceptions#raiseIf(boolean, Function, String, Consumer)
+     * @see Exceptions#raiseIf(boolean, BiFunction, Throwable, String, Consumer)
+     * @see Exceptions#raiseUnless(boolean, Function, String, Consumer)
+     * @see Exceptions#raiseUnless(boolean, BiFunction, Throwable, String, Consumer)
+     */
+    @FunctionalInterface
+    public interface FormatArgs {
+        void args(Object... args);
+    }
 
     public static <E extends Exception> E create(Function<? super String, ? extends E> fn, String format,
         Object... args) {
@@ -69,6 +81,13 @@ public class Exceptions {
     }
 
     public static <E extends Exception> void raiseIf(boolean condition, Function<? super String, ? extends E> fn,
+        String format, Consumer<FormatArgs> argsProvider) throws E {
+        if (condition) {
+            raise(fn, message(format,argsProvider));
+        }
+    }
+
+    public static <E extends Exception> void raiseIf(boolean condition, Function<? super String, ? extends E> fn,
         Supplier<String> message) throws E {
         if (condition) {
             raise(fn, message);
@@ -76,6 +95,11 @@ public class Exceptions {
     }
 
     public static <E extends Exception> void raiseUnless(boolean condition, Function<? super String, ? extends E> fn,
+        String format, Consumer<FormatArgs> argsProvider) throws E {
+        raiseIf(!condition, fn, format, argsProvider);
+    }
+
+    public static <E extends Exception> void raiseUnless(boolean condition, Function<? super String, ? extends E> fn,
         Supplier<String> message) throws E {
         raiseIf(!condition, fn, message);
     }
@@ -103,6 +127,14 @@ public class Exceptions {
     }
 
     public static <E extends Exception, C extends Throwable> void raiseIf(boolean condition,
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, String format,
+        Consumer<FormatArgs> argsProvider) throws E {
+        if (condition) {
+            raise(fn, cause, message(format, argsProvider));
+        }
+    }
+
+    public static <E extends Exception, C extends Throwable> void raiseIf(boolean condition,
         BiFunction<? super String, ? super C, ? extends E> fn, C cause, Supplier<String> message) throws E {
         if (condition) {
             raise(fn, cause, message);
@@ -110,6 +142,12 @@ public class Exceptions {
     }
 
     public static <E extends Exception, C extends Throwable> void raiseUnless(boolean condition,
+        BiFunction<? super String, ? super C, ? extends E> fn, C cause, String format,
+        Consumer<FormatArgs> argsProvider) throws E {
+        raiseIf(!condition, fn, cause, message(format, argsProvider));
+    }
+
+    public static <E extends Exception, C extends Throwable> void raiseUnless(boolean condition,
         BiFunction<? super String, ? super C, ? extends E> fn, C cause, Supplier<String> message) throws E {
         raiseIf(!condition, fn, cause, message);
     }
@@ -133,6 +171,12 @@ public class Exceptions {
         return t;
     }
 
+    private static Supplier<String> message(String format, Consumer<FormatArgs> argsProvider) {
+        final ObjectWrapper<Object[]> args = new ObjectWrapper<>();
+        argsProvider.accept(args::accept);
+        return () -> String.format(format, args.get());
+    }
+
     private Exceptions() {
     }
 }

http://git-wip-us.apache.org/repos/asf/bval/blob/7b3c58e0/bval-jsr/src/main/java/org/apache/bval/util/Validate.java
----------------------------------------------------------------------
diff --git a/bval-jsr/src/main/java/org/apache/bval/util/Validate.java b/bval-jsr/src/main/java/org/apache/bval/util/Validate.java
index 042dc1b..4958f1d 100644
--- a/bval-jsr/src/main/java/org/apache/bval/util/Validate.java
+++ b/bval-jsr/src/main/java/org/apache/bval/util/Validate.java
@@ -47,8 +47,10 @@ public final class Validate {
         Validate.notNull(array);
 
         for (int i = 0; i < array.length; i++) {
-            Exceptions.raiseIf(array[i] == null, IllegalArgumentException::new, message,
-                ObjectUtils.arrayAdd(values, Integer.valueOf(i)));
+            if (array[i] == null) {
+                Exceptions.raise(IllegalArgumentException::new, message,
+                    ObjectUtils.arrayAdd(values, Integer.valueOf(i)));
+            }
         }
         return array;
     }