// 2. validate parameter constraints
for ( int i = 0; i < parameterValues.length; i++ ) {
PathImpl originalPath = valueContext.getPropertyPath();
ParameterMetaData parameterMetaData = executableMetaData.getParameterMetaData( i );
Object value = parameterValues[i];
if ( value != null ) {
Class<?> valueType = value.getClass();
if ( parameterMetaData.getType() instanceof Class && ( (Class<?>) parameterMetaData.getType() ).isPrimitive() ) {
valueType = ReflectionHelper.unBoxedType( valueType );
}
if ( !TypeHelper.isAssignable(
TypeHelper.getErasedType( parameterMetaData.getType() ),
valueType
) ) {
throw log.getParameterTypesDoNotMatchException(
valueType.getName(),
parameterMetaData.getType().toString(),
i,
validationContext.getExecutable().getMember()
);
}
}
valueContext.appendNode( parameterMetaData );
valueContext.setUnwrapMode( parameterMetaData.unwrapMode() );
valueContext.setCurrentValidatedValue( value );
numberOfViolationsOfCurrentGroup += validateConstraintsForGroup(
validationContext, valueContext, parameterMetaData
);
if ( shouldFailFast( validationContext ) ) {
return validationContext.getFailingConstraints().size() - numberOfViolationsBefore;
}
if ( !parameterMetaData.isCascading() ) {
numberOfViolationsOfCurrentGroup += validateConstraintsForGroup(
validationContext, valueContext, parameterMetaData.getTypeArgumentsConstraints()
);
if ( shouldFailFast( validationContext ) ) {
return validationContext.getFailingConstraints().size() - numberOfViolationsBefore;
}
}