spring-projects/spring-framework · error · IllegalStateException
Unsupported executable: {}
Error message
Unsupported executable: {} What it means
BeanInstanceSupplier.getMethodParameter maps a java.lang.reflect.Executable to a MethodParameter; only Constructor and Method are supported. Any other Executable subclass triggers this IllegalStateException. In practice Java reflection only produces those two, so this is a defensive guard for an unexpected (typically framework-introduced) executable type.
Source
Thrown at spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanInstanceSupplier.java:277
descriptor = new ShortcutDependencyDescriptor(descriptor, shortcut);
}
ValueHolder argumentValue = argumentValues[i];
resolved[i] = resolveAutowiredArgument(
registeredBean, descriptor, argumentValue, autowiredBeanNames);
}
registerDependentBeans(registeredBean.getBeanFactory(), registeredBean.getBeanName(), autowiredBeanNames);
return AutowiredArguments.of(resolved);
}
private MethodParameter getMethodParameter(Executable executable, int index) {
if (executable instanceof Constructor<?> constructor) {
return new MethodParameter(constructor, index);
}
if (executable instanceof Method method) {
return new MethodParameter(method, index);
}
throw new IllegalStateException("Unsupported executable: " + executable.getClass().getName());
}
private ValueHolder[] resolveArgumentValues(RegisteredBean registeredBean, Executable executable) {
Parameter[] parameters = executable.getParameters();
ValueHolder[] resolved = new ValueHolder[parameters.length];
RootBeanDefinition beanDefinition = registeredBean.getMergedBeanDefinition();
if (beanDefinition.hasConstructorArgumentValues() &&
registeredBean.getBeanFactory() instanceof AbstractAutowireCapableBeanFactory beanFactory) {
BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(
beanFactory, registeredBean.getBeanName(), beanDefinition, beanFactory.getTypeConverter());
ConstructorArgumentValues values = resolveConstructorArguments(
valueResolver, beanDefinition.getConstructorArgumentValues());
Set<ValueHolder> usedValueHolders = CollectionUtils.newHashSet(parameters.length);
for (int i = 0; i < parameters.length; i++) {
Class<?> parameterType = parameters[i].getType();
String parameterName = (parameters[i].isNamePresent() ? parameters[i].getName() : null);
ValueHolder valueHolder = values.getArgumentValue(
i, parameterType, parameterName, usedValueHolders);View on GitHub (pinned to e8729d0438)
Solutions
- Identify what is injecting the non-standard Executable (agent, Mockito, Lombok rewrite, custom classloader).
- Disable or update the offending instrumentation library for the AOT/native build.
- If this reproduces with plain JDK reflection, isolate a minimal bean and report it - it should not occur in stock Spring.
Defensive patterns
Strategy: type-guard
Validate before calling
Executable e = ...;
if (!(e instanceof Constructor || e instanceof Method)) {
throw new IllegalStateException("Non-standard Executable: " + e.getClass());
} Type guard
boolean isStandardExecutable(Executable e) {
return e instanceof Constructor || e instanceof Method;
} Prevention
- Disable bytecode-rewriting agents during AOT unless known-compatible.
- Keep the JDK standard; avoid custom reflection implementations.
- If this fires, suspect instrumentation first.
When it happens
Trigger: An Executable passed into the AOT/resolution path is an instance of a class that is neither java.lang.reflect.Constructor nor java.lang.reflect.Method (e.g. a custom reflective or bytecode-rewritten executable).
Common situations: Extremely rare; occurs when an agent, bytecode-rewriting library, or a custom reflection implementation supplies a non-standard Executable. Usually indicates a corrupted classpath or an aggressive instrumentation library.
Related errors
- Unexpected MethodOverride subclass: {}
- Unsupported executable {}
- Argument type mismatch: expected '{}' for value [{}]
- Failed to load Class [{}] from ClassLoader [{}]
- {} cannot be found on {}
AI-assisted analysis of spring-projects/spring-framework@e8729d0438 (2026-08-04).
Data as JSON: /data/errors/efb23649ed1593b8.json.
Report an issue: GitHub.