spring-projects/spring-security · error · RuntimeException

Could not postProcess

Error message

Could not postProcess {object} of type {type}

What it means

AutowireBeanFactoryObjectPostProcessor.postProcess initializes and autowires arbitrary objects against the BeanFactory; if initializeBeanIfNeeded throws a RuntimeException, it wraps it in a RuntimeException('Could not postProcess <object> of type <type>') preserving the cause. It signals that Spring could not lifecycle-initialize an object created by a security configurer.

Solutions

  1. Inspect the cause chain (ex.getCause()) of the thrown RuntimeException for the real initialization failure.
  2. Fix the underlying object's configuration (port conflicts, missing resources, invalid properties).
  3. Ensure required classes/dependencies exist at runtime, especially for embedded servers (unboundid-ldapsdk) and native images (registration/hints).
  4. If the object does not need bean initialization, avoid wrapping it with objectPostProcessor or use a plain constructor.

Example fix

// before
LdapBindAuthenticationManagerFactory f = new LdapBindAuthenticationManagerFactory(contextSource); // init failed, cause hidden
// after
catch (RuntimeException e) {
    log.error("postProcess failed: {}", e.getCause(), e.getCause()); // find the real init error first
}
// then fix the underlying config, e.g. free the LDAP port or fix the LDIF path
Defensive patterns

Strategy: try-catch

Validate before calling

// validate object config before post-processing
if (object instanceof UnboundIdContainer c && c.getPort() == 0) {
    throw new IllegalArgumentException("embedded LDAP port must be set");
}

Try / catch

try {
    processed = objectPostProcessor.postProcess(object);
} catch (RuntimeException e) {
    // 'Could not postProcess ... of type ...' always wraps the real cause
    log.error("Post-process failed for {}: {}", e.getMessage(), e.getCause(), e.getCause());
    throw e;
}

Prevention

When it happens

Trigger: Any object passed through ObjectPostProcessor whose init()/afterPropertiesSet() or bean initialization throws — e.g. an embedded LDAP server failing to start, a filter bean with bad configuration — during security configuration building.

Common situations: Embedded LDAP port already in use or missing LDIF; misconfigured servlet filters passed via addFilter with postProcess; beans requiring dependencies unavailable at that lifecycle stage; native-image/GraalVM environments where reflective init fails.

Related errors


AI-assisted analysis of spring-projects/spring-security@96852e8860 (2026-09-10). Data as JSON: /api/errors/90d0cf3f07005a41. Report an issue: GitHub.

Appendix: source

Thrown at config/src/main/java/org/springframework/security/config/annotation/configuration/AutowireBeanFactoryObjectPostProcessor.java:71

	private final List<SmartInitializingSingleton> smartSingletons = new ArrayList<>();

	AutowireBeanFactoryObjectPostProcessor(AutowireCapableBeanFactory autowireBeanFactory) {
		Assert.notNull(autowireBeanFactory, "autowireBeanFactory cannot be null");
		this.autowireBeanFactory = autowireBeanFactory;
	}

	@Override
	public <T> T postProcess(T object) {
		if (object == null) {
			return null;
		}
		T result = null;
		try {
			result = initializeBeanIfNeeded(object);
		}
		catch (RuntimeException ex) {
			Class<?> type = object.getClass();
			throw new RuntimeException("Could not postProcess " + object + " of type " + type, ex);
		}
		this.autowireBeanFactory.autowireBean(object);
		if (result instanceof DisposableBean) {
			this.disposableBeans.add((DisposableBean) result);
		}
		if (result instanceof SmartInitializingSingleton) {
			this.smartSingletons.add((SmartInitializingSingleton) result);
		}
		return result;
	}

	/**
	 * Invokes {@link AutowireCapableBeanFactory#initializeBean(Object, String)} only if
	 * needed, i.e when the application is not a native image or the object is not a CGLIB
	 * proxy.
	 * @param object the object to initialize
	 * @param <T> the type of the object
	 * @return the initialized bean or an existing bean if the object is a CGLIB proxy and

View on GitHub (pinned to 96852e8860)