diff --git a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ExecutableConstraintMappingContextImpl.java b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ExecutableConstraintMappingContextImpl.java index 9caa1cbf15..ac4111108f 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ExecutableConstraintMappingContextImpl.java +++ b/engine/src/main/java/org/hibernate/validator/internal/cfg/context/ExecutableConstraintMappingContextImpl.java @@ -112,7 +112,7 @@ public ConstrainedElement build(ConstraintHelper constraintHelper, TypeResolutio crossParameterContext != null ? crossParameterContext.getConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ) : Collections.>emptySet(), returnValueContext != null ? returnValueContext.getConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ) : Collections.>emptySet(), returnValueContext != null ? returnValueContext.getTypeArgumentConstraints( constraintHelper, typeResolutionHelper, valueExtractorManager ) : Collections.>emptySet(), - returnValueContext != null ? returnValueContext.getCascadingMetaData() : CascadingTypeParameter.nonCascading( ReflectionHelper.typeOf( executable ) ) + returnValueContext != null ? returnValueContext.getCascadingMetaData() : CascadingTypeParameter.nonCascading() ); } diff --git a/engine/src/main/java/org/hibernate/validator/internal/metadata/cascading/CascadingTypeParameter.java b/engine/src/main/java/org/hibernate/validator/internal/metadata/cascading/CascadingTypeParameter.java index a644c8bec4..d387dab552 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/metadata/cascading/CascadingTypeParameter.java +++ b/engine/src/main/java/org/hibernate/validator/internal/metadata/cascading/CascadingTypeParameter.java @@ -33,6 +33,9 @@ public class CascadingTypeParameter { private static final Log LOG = LoggerFactory.make(); + private static final CascadingTypeParameter NON_CASCADING = + new CascadingTypeParameter( null, null, false, Collections.emptyMap(), Collections.emptyMap() ); + /** * The enclosing type that defines this type parameter. */ @@ -90,9 +93,8 @@ public CascadingTypeParameter(Type enclosingType, TypeVariable typeParameter, hasGroupConversionsOnElementOrContainerElements = tmpHasGroupConversionsOnElementOrContainerElements; } - public static CascadingTypeParameter nonCascading(Type cascadableType) { - // as it's non cascading anyway, we can also treat the arrays as annotated object - return annotatedObject( cascadableType, false, Collections.emptyMap(), Collections.emptyMap() ); + public static CascadingTypeParameter nonCascading() { + return NON_CASCADING; } public static CascadingTypeParameter annotatedObject(Type cascadableType, boolean cascading, @@ -135,6 +137,13 @@ public Map, CascadingTypeParameter> getContainerElementTypesCasc } public CascadingTypeParameter merge(CascadingTypeParameter otherCascadingTypeParameter) { + if ( this == NON_CASCADING ) { + return otherCascadingTypeParameter; + } + if ( otherCascadingTypeParameter == NON_CASCADING ) { + return this; + } + boolean cascading = this.cascading || otherCascadingTypeParameter.cascading; Map, Class> groupConversions = mergeGroupConversion( this.groupConversions, otherCascadingTypeParameter.groupConversions ); diff --git a/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java b/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java index 34a2d923f5..82a31b4a21 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java +++ b/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java @@ -327,7 +327,7 @@ private ConstrainedExecutable findExecutableMetaData(Executable executable) { if ( annotationProcessingOptions.areReturnValueConstraintsIgnoredFor( executable ) ) { returnValueConstraints = Collections.emptySet(); typeArgumentsConstraints = Collections.emptySet(); - cascadingMetaData = CascadingTypeParameter.nonCascading( ReflectionHelper.typeOf( executable ) ); + cascadingMetaData = CascadingTypeParameter.nonCascading(); } else { typeArgumentsConstraints = findTypeAnnotationConstraints( executable ); @@ -401,7 +401,7 @@ private List getParameterMetaData(Executable executable) { i, parameterConstraints, Collections.emptySet(), - CascadingTypeParameter.nonCascading( type ) + CascadingTypeParameter.nonCascading() ) ); i++; @@ -607,7 +607,7 @@ private CascadingTypeParameter findCascadingMetaData(Executable executable, int } catch (ArrayIndexOutOfBoundsException ex) { log.warn( MESSAGES.constraintOnConstructorOfNonStaticInnerClass(), ex ); - return CascadingTypeParameter.nonCascading( ReflectionHelper.typeOf( parameter.getDeclaringExecutable(), i ) ); + return CascadingTypeParameter.nonCascading(); } } diff --git a/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedParameter.java b/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedParameter.java index 2d00bdb85b..26adef5082 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedParameter.java +++ b/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedParameter.java @@ -40,7 +40,7 @@ public ConstrainedParameter(ConfigurationSource source, index, Collections.>emptySet(), Collections.>emptySet(), - CascadingTypeParameter.nonCascading( type ) + CascadingTypeParameter.nonCascading() ); } diff --git a/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedType.java b/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedType.java index 687726d654..a05cd1e540 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedType.java +++ b/engine/src/main/java/org/hibernate/validator/internal/metadata/raw/ConstrainedType.java @@ -37,7 +37,7 @@ public ConstrainedType(ConfigurationSource source, Class beanClass, Set> returnValueConstraints = new HashSet<>(); Set> returnValueTypeArgumentConstraints = new HashSet<>(); - List cascadingTypeParameters = new ArrayList<>(); CascadingTypeParameter cascadingMetaData = parseReturnValueType( returnValueType, executable, returnValueConstraints, returnValueTypeArgumentConstraints, - cascadingTypeParameters, defaultPackage ); @@ -268,10 +265,9 @@ private CascadingTypeParameter parseReturnValueType(ReturnValueType returnValueT Executable executable, Set> returnValueConstraints, Set> returnValueTypeArgumentConstraints, - List cascadingTypeParameters, String defaultPackage) { if ( returnValueType == null ) { - return CascadingTypeParameter.nonCascading( ReflectionHelper.typeOf( executable ) ); + return CascadingTypeParameter.nonCascading(); } ConstraintLocation constraintLocation = ConstraintLocation.forReturnValue( executable ); diff --git a/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/AbstractMethodValidationTest.java b/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/AbstractMethodValidationTest.java index bf00cd5456..3031bb1671 100644 --- a/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/AbstractMethodValidationTest.java +++ b/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/AbstractMethodValidationTest.java @@ -265,9 +265,7 @@ public void cascadingIterableParameter() { } } - // FIXME HV-1330: we have transient failures with this test - // sometimes the exception is not thrown - @Test(enabled = false) + @Test public void cascadingArrayParameter() { Customer customer = new Customer( null );