Now that #31495 has been resolved, loading the AOT-optimized ApplicationContext
for Spr9799XmlConfigTests
fails with the following cause.
java.lang.IllegalArgumentException: ValueHolder must not be null
at org.springframework.util.Assert.notNull(Assert.java:172) ~[?:?]
at org.springframework.beans.factory.config.ConstructorArgumentValues.addIndexedArgumentValue(ConstructorArgumentValues.java:111) ~[?:?]
at org.springframework.web.servlet.handler.MappedInterceptor__TestContext001_BeanDefinitions.getMappedInterceptorBeanDefinition(MappedInterceptor__TestContext001_BeanDefinitions.java:27) ~[?:?]
at org.springframework.test.context.junit4.spr9799.Spr9799XmlConfigTests__TestContext001_BeanFactoryRegistrations.registerBeanDefinitions(Spr9799XmlConfigTests__TestContext001_BeanFactoryRegistrations.java:57) ~[?:?]
at org.springframework.test.context.junit4.spr9799.Spr9799XmlConfigTests__TestContext001_ApplicationContextInitializer.initialize(Spr9799XmlConfigTests__TestContext001_ApplicationContextInitializer.java:19) ~[?:?]
at org.springframework.test.context.junit4.spr9799.Spr9799XmlConfigTests__TestContext001_ApplicationContextInitializer.initialize(Spr9799XmlConfigTests__TestContext001_ApplicationContextInitializer.java:13) ~[?:?]
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContextForAotRuntime(AbstractGenericContextLoader.java:170) ~[main/:?]
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContextForAotRuntime(AbstractGenericContextLoader.java:1) ~[main/:?]
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContextForAotRuntime(AbstractDelegatingSmartContextLoader.java:263) ~[main/:?]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInAotMode(DefaultCacheAwareContextLoaderDelegate.java:255) ~[main/:?]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:149) ~[main/:?]
Generated Code:
package org.springframework.web.servlet.handler;
import java.lang.String;
import org.springframework.beans.factory.aot.BeanInstanceSupplier;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.web.servlet.HandlerInterceptor;
/**
* Bean definitions for {@link MappedInterceptor}.
*/
public class MappedInterceptor__TestContext001_BeanDefinitions {
// other methods
/**
* Get the bean definition for 'mappedInterceptor#0'.
*/
public static BeanDefinition getMappedInterceptorBeanDefinition() {
RootBeanDefinition beanDefinition = new RootBeanDefinition(MappedInterceptor.class);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, null);
beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(1, ConversionServiceExposingInterceptor__TestContext001_BeanDefinitions.getMappedInterceptorInnerBeanBeanDefinition());
beanDefinition.setInstanceSupplier(getMappedInterceptorInstanceSupplier());
return beanDefinition;
}
}
This line is the source of the exception:
beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, null);
Since addIndexedArgumentValue(...)
is overloaded, the compiler picks the variant that accepts a ValueHolder
when the second argument is null
, and that variant has a notNull
check for the ValueHolder
.
Updating the code generator so that it generates the following seems to be one way to address this issue.
beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, (Object) null);
Comment From: snicoll
Those damn overloaded methods.