theonedev/onedev · error · ValidationException

Invalid parameter count for executable {executable}: expecte

Error message

Invalid parameter count for executable {executable}: expected {expected} parameters but got {actual}.

What it means

Thrown by forExecutables().validateParameters()/validateReturnValue() when the caller passes a different number of argument values than the validated executable (method or constructor) declares. The validator compares parameterValues.length against the executable's parameter type count and fails fast rather than validating a mismatched invocation.

Source

Thrown at server-core/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java:901

		return validationContext.getFailingConstraints();
	}

	private <T> void validateParametersInContext(ExecutableValidationContext<T> validationContext,
			Object[] parameterValues,
			ValidationOrder validationOrder) {
		BeanMetaData<T> beanMetaData = validationContext.getRootBeanMetaData();

		Optional<ExecutableMetaData> executableMetaDataOptional = validationContext.getExecutableMetaData();

		if ( !executableMetaDataOptional.isPresent() ) {
			// the method is unconstrained
			return;
		}

		ExecutableMetaData executableMetaData = executableMetaDataOptional.get();

		if ( parameterValues.length != executableMetaData.getParameterTypes().length ) {
			throw LOG.getInvalidParameterCountForExecutableException(
					ExecutableHelper.getExecutableAsString(
							executableMetaData.getType().toString() + "#" + executableMetaData.getName(),
							executableMetaData.getParameterTypes()
					),
					executableMetaData.getParameterTypes().length,
					parameterValues.length
			);
		}

		if ( beanMetaData.isDefaultGroupSequenceRedefined() ) {
			validationOrder.assertDefaultGroupSequenceIsExpandable(
					beanMetaData.getDefaultGroupSequence(
							validationContext.getRootBean()
					)
			);
		}

		// process first single groups

View on GitHub (pinned to d44925c47c)

Solutions

  1. Pass exactly executable.getParameterTypes().length values (use null placeholders for arguments you don't want validated).
  2. Update hardcoded parameter arrays after any method signature change.
  3. Resolve the Method object from the same class the parameter values were written for.

Example fix

// before
validator.forExecutables().validateParameters(service, method, new Object[]{name});

// after
Object[] args = new Object[method.getParameterCount()];
args[0] = name;
validator.forExecutables().validateParameters(service, method, args);
Defensive patterns

Strategy: validation

Validate before calling

if (args.length != method.getParameterCount()) {
    throw new IllegalArgumentException("expected " + method.getParameterCount()
        + " parameters but got " + args.length);
}

Type guard

null

Try / catch

try {
    validator.forExecutables().validateParameters(target, method, args);
} catch (ValidationException e) {
    if (e.getMessage().contains("Invalid parameter count")) {
        // rebuild args from method.getParameterTypes() with null placeholders
    } else throw e;
}

Prevention

When it happens

Trigger: Calling Validator.forExecutables(...).validateParameters(object, method, new Object[]{...}) with an array whose length differs from method.getParameterTypes().length — e.g. after refactoring the method signature, or passing null/default args arrays for varargs or inherited methods resolved via the wrong Class object.

Common situations: Signature changes without updating validation harness code, resolving a Method from a superclass but passing parameters typed for a subclass overload, generic/varargs methods where the caller miscounts expanded varargs.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/50d35098d015e6da. Report an issue: GitHub.