Skip to content

ConfigurationClassPostProcessor's MetaData resolution ignores the defining class loader, failing to load classes from transitive class loaders [SPR-12626] #17227

Closed
@spring-projects-issues

Description

@spring-projects-issues

Olaf Otto opened SPR-12626 and commented

During the resolution of AnnotationMetadata, the following issue arises if a class A with classloader Ca and a super class B with classloaderCb is processed in the ConfigurationClassParser (provided Cb is not the parent of Ca, for instance when using imported types in OSGi)

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to load bean class: <A> nested exception is java.io.FileNotFoundException: class path resource path/to/B.class] cannot be opened because it does not exist
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:291)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:242)

Here, the parsing of the super class is unaware of the class loader of the extending class:

String superclass = metadata.getSuperClassName();
...
MetadataReader reader = this.metadataReaderFactory.getMetadataReader(superclass);
return reader.getAnnotationMetadata();

However, this also is an architectural issue, as it is an explicit design goal of the ClassMetadata not to load the type (resulting in the defining class loader being ignored), as state in the ClassMetaData JavaDoc:

* in a form that does not require that class to be loaded yet.

As there is no way to determine the defining class loader without loading the class, I do suggest to drop this design goal as it directly contradicts proper treatment of class loading semantics.


Affects: 3.2.13

Attachments:

Metadata

Metadata

Assignees

No one assigned

    Labels

    in: coreIssues in core modules (aop, beans, core, context, expression)status: bulk-closedAn outdated, unresolved issue that's closed in bulk as part of a cleaning process

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions