Tim Reidel opened SPR-13177 and commented
I ran into an issue with my spring-based project that results in a hard-to diagnose error. Fortunately I also have the solution. :)
When starting my application using spring-boot I get the following exception trace:
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [ XXXXXXX ]; nested exception is java.lang.IllegalArgumentException: Attribute 'basePackageClasses' not found
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:179)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:306)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:239)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at com.fancypants.common.application.Application.main(Application.java:36)
Caused by: java.lang.IllegalArgumentException: Attribute 'basePackageClasses' not found
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.core.annotation.AnnotationAttributes.doGet(AnnotationAttributes.java:108)
at org.springframework.core.annotation.AnnotationAttributes.getClassArray(AnnotationAttributes.java:93)
at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:127)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:265)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:229)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:196)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:165)
... 10 more
where XXXXXXX = one of my configuration classes.
basePackageClasses is certainly defined in the @ComponentScan annotation. It turns out that one of the classes referenced in basePackageClasses is not defined. The effect of this is that in AnnotationReadingVisitorUtils (which helps to parse the annotation) a ClassNotFoundException is thrown. This is expected and normal since my configuration was wrong and I was missing some jars in the classpath.
The ClassNotFoundException is caught by this piece of code in AnnotationReadingVisitorUtils:
catch (Exception ex) {
// Class not found - can't resolve class reference in annotation
// attribute.
}
Nothing is done with the error with the effect being that basePackageClasses is not defined in the resulting AnnotiationAttributes object. Later on when the AnnotationAttributes object is queried for the basePackageClasses they aren't found, resulting in the misleading error above.
My suggestion is to throw an IllegalArgumentException in the catch block above, indicating which class was not found. I can likely submit a pull request to this effect if needed.
Affects: 4.1.6
Referenced from: commits b7acddb
Tim Reidel opened SPR-13177 and commented
I ran into an issue with my spring-based project that results in a hard-to diagnose error. Fortunately I also have the solution. :)
When starting my application using spring-boot I get the following exception trace:
where
XXXXXXX= one of my configuration classes.basePackageClassesis certainly defined in the@ComponentScanannotation. It turns out that one of the classes referenced inbasePackageClassesis not defined. The effect of this is that inAnnotationReadingVisitorUtils(which helps to parse the annotation) aClassNotFoundExceptionis thrown. This is expected and normal since my configuration was wrong and I was missing some jars in the classpath.The
ClassNotFoundExceptionis caught by this piece of code inAnnotationReadingVisitorUtils:Nothing is done with the error with the effect being that
basePackageClassesis not defined in the resultingAnnotiationAttributesobject. Later on when theAnnotationAttributesobject is queried for thebasePackageClassesthey aren't found, resulting in the misleading error above.My suggestion is to throw an
IllegalArgumentExceptionin thecatchblock above, indicating which class was not found. I can likely submit a pull request to this effect if needed.Affects: 4.1.6
Referenced from: commits b7acddb