Fixed SPR-5655 - dm Server issues with ConfigurationClassPostProcessor attempting to read .class files with ASM with incorrect class loader

This commit is contained in:
Chris Beams
2009-04-06 21:23:37 +00:00
parent b14d760c9b
commit 254bf7e403
2 changed files with 41 additions and 4 deletions

View File

@@ -26,9 +26,11 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
@@ -122,7 +124,7 @@ public class ConfigurationClassPostProcessor extends AbstractConfigurationClassP
if (beanDef.isAbstract() && !includeAbstractBeanDefs)
continue;
if (isConfigurationClassBeanDefinition(beanDef))
if (isConfigurationClassBeanDefinition(beanDef, beanFactory.getBeanClassLoader()))
configBeanDefs.registerBeanDefinition(beanName, beanDef);
}
@@ -181,14 +183,20 @@ public class ConfigurationClassPostProcessor extends AbstractConfigurationClassP
* @return whether the BeanDefinition's beanClass (or its ancestry) is
* {@link Configuration}-annotated, false if no beanClass is specified.
*/
private static boolean isConfigurationClassBeanDefinition(BeanDefinition beanDef) {
private static boolean isConfigurationClassBeanDefinition(BeanDefinition beanDef, ClassLoader classLoader) {
// accommodating SPR-5655
Assert.isInstanceOf(AbstractBeanDefinition.class, beanDef);
if(((AbstractBeanDefinition) beanDef).hasBeanClass())
return AnnotationUtils.findAnnotation(
((AbstractBeanDefinition)beanDef).getBeanClass(), Configuration.class) != null;
String className = beanDef.getBeanClassName();
while (className != null && !(className.equals(Object.class.getName()))) {
try {
MetadataReader metadataReader =
new SimpleMetadataReaderFactory().getMetadataReader(className);
new SimpleMetadataReaderFactory(classLoader).getMetadataReader(className);
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
ClassMetadata classMetadata = metadataReader.getClassMetadata();