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 groupsView on GitHub (pinned to d44925c47c)
Solutions
- Pass exactly executable.getParameterTypes().length values (use null placeholders for arguments you don't want validated).
- Update hardcoded parameter arrays after any method signature change.
- 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
- Always size the args array from executable.getParameterCount()/getParameterTypes().
- Fill unknown arguments with null placeholders instead of omitting them.
- Re-derive Method objects after signature refactors instead of caching stale ones.
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
- Parameter types do not match: expected type {expected} but f
- Getter not found for property: ${propertyName}
- Getter not found for property: ${dependsOn.property()}
- Error invoking getter for property: ${dependsOn.property()}
- Unknown collection element class (bean: X, property: Y)
AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06).
Data as JSON: /api/errors/50d35098d015e6da.
Report an issue: GitHub.