From ab1e51b44411d63bd6fba97c91cc320010c3e225 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Fri, 20 Jan 2017 10:02:23 +0100 Subject: [PATCH] HV-1220 Make programmatically defined cross parameter constraints on the parameters of a method returning void work as expected The location used was the one of a return value so it kinda worked if the method had parameters as the return value type was Object which is supported for cross parameter constraints but it failed as long as the return value type was void. --- .../cfg/context/ConfiguredConstraint.java | 8 +++- ...ParameterConstraintMappingContextImpl.java | 2 +- .../PropertyConstraintMappingContextImpl.java | 2 +- ...turnValueConstraintMappingContextImpl.java | 2 +- .../test/cfg/MethodConstraintMappingTest.java | 39 +++++++++++++++++++ 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ConfiguredConstraint.java b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ConfiguredConstraint.java index 6de15cf46d..7b60f8894c 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ConfiguredConstraint.java +++ b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ConfiguredConstraint.java @@ -59,12 +59,18 @@ public static ConfiguredConstraint forParameter(Constr ); } - public static ConfiguredConstraint forExecutable(ConstraintDef constraint, ExecutableElement executable) { + public static ConfiguredConstraint forReturnValue(ConstraintDef constraint, ExecutableElement executable) { return new ConfiguredConstraint( constraint, ConstraintLocation.forReturnValue( executable ), executable.getElementType() ); } + public static ConfiguredConstraint forCrossParameter(ConstraintDef constraint, ExecutableElement executable) { + return new ConfiguredConstraint( + constraint, ConstraintLocation.forCrossParameter( executable ), executable.getElementType() + ); + } + public ConstraintDef getConstraint() { return constraint; } diff --git a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/CrossParameterConstraintMappingContextImpl.java b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/CrossParameterConstraintMappingContextImpl.java index 1151df70c2..8f1c8d340a 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/CrossParameterConstraintMappingContextImpl.java +++ b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/CrossParameterConstraintMappingContextImpl.java @@ -32,7 +32,7 @@ final class CrossParameterConstraintMappingContextImpl @Override public CrossParameterConstraintMappingContext constraint(ConstraintDef definition) { - super.addConstraint( ConfiguredConstraint.forExecutable( definition, executableContext.getExecutable() ) ); + super.addConstraint( ConfiguredConstraint.forCrossParameter( definition, executableContext.getExecutable() ) ); return this; } diff --git a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/PropertyConstraintMappingContextImpl.java b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/PropertyConstraintMappingContextImpl.java index 52d4acc88d..36c50acfb2 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/PropertyConstraintMappingContextImpl.java +++ b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/PropertyConstraintMappingContextImpl.java @@ -62,7 +62,7 @@ public PropertyConstraintMappingContext constraint(ConstraintDef definitio } else { super.addConstraint( - ConfiguredConstraint.forExecutable( + ConfiguredConstraint.forReturnValue( definition, ExecutableElement.forMethod( (Method) member ) ) ); diff --git a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ReturnValueConstraintMappingContextImpl.java b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ReturnValueConstraintMappingContextImpl.java index e903c2d30c..f71d85babb 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ReturnValueConstraintMappingContextImpl.java +++ b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ReturnValueConstraintMappingContextImpl.java @@ -39,7 +39,7 @@ protected ReturnValueConstraintMappingContext getThis() { @Override public ReturnValueConstraintMappingContext constraint(ConstraintDef definition) { - super.addConstraint( ConfiguredConstraint.forExecutable( definition, executableContext.getExecutable() ) ); + super.addConstraint( ConfiguredConstraint.forReturnValue( definition, executableContext.getExecutable() ) ); return this; } diff --git a/engine/src/test/java/org/hibernate/validator/test/cfg/MethodConstraintMappingTest.java b/engine/src/test/java/org/hibernate/validator/test/cfg/MethodConstraintMappingTest.java index 5d44c5eac7..3fd0f7e069 100644 --- a/engine/src/test/java/org/hibernate/validator/test/cfg/MethodConstraintMappingTest.java +++ b/engine/src/test/java/org/hibernate/validator/test/cfg/MethodConstraintMappingTest.java @@ -666,6 +666,38 @@ public void crossParameterConstraint() { } } + @Test + @TestForIssue(jiraKey = "HV-1220") + public void crossParameterConstraintOnMethodReturningVoid() { + ConstraintMapping mapping = config.createConstraintMapping(); + mapping.type( GreetingService.class ) + .method( "sayNothing", String.class ) + .crossParameter() + .constraint( + new GenericConstraintDef( + GenericAndCrossParameterConstraint.class + ) + ); + config.addMapping( mapping ); + + try { + GreetingService service = getValidatingProxy( + wrappedObject, + config.buildValidatorFactory().getValidator() + ); + service.sayNothing( "" ); + + fail( "Expected exception wasn't thrown." ); + } + catch (ConstraintViolationException e) { + + assertCorrectConstraintViolationMessages( + e, "default message" + ); + assertCorrectPropertyPaths( e, "sayNothing." ); + } + } + private interface TestGroup { } @@ -708,6 +740,8 @@ public interface GreetingService { User getUser(); + void sayNothing(String string1); + } public class GreetingServiceImpl implements GreetingService { @@ -747,5 +781,10 @@ public Message getHello() { public User getUser() { return new User( null ); } + + @Override + public void sayNothing(String string1) { + // Nothing to do + } } }