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

  1. Identify what is injecting the non-standard Executable (agent, Mockito, Lombok rewrite, custom classloader).
  2. Disable or update the offending instrumentation library for the AOT/native build.
  3. 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

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


AI-assisted analysis of spring-projects/spring-framework@e8729d0438 (2026-08-04). Data as JSON: /data/errors/efb23649ed1593b8.json. Report an issue: GitHub.