diff --git a/org.springframework.context/src/main/java/org/springframework/jmx/export/MBeanExporter.java b/org.springframework.context/src/main/java/org/springframework/jmx/export/MBeanExporter.java
index ccd1973f9a1fcef107dac684456cd6d420b50387..6b02d5b92de7b36ac1ae357f448aeec077f4438e 100644
--- a/org.springframework.context/src/main/java/org/springframework/jmx/export/MBeanExporter.java
+++ b/org.springframework.context/src/main/java/org/springframework/jmx/export/MBeanExporter.java
@@ -44,7 +44,6 @@ import org.springframework.aop.target.LazyInitTargetSource;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.beans.factory.BeanIsAbstractException;
import org.springframework.beans.factory.CannotLoadBeanClassException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
@@ -873,7 +872,7 @@ public class MBeanExporter extends MBeanRegistrationSupport
beanNames.addAll(Arrays.asList(((ConfigurableBeanFactory) this.beanFactory).getSingletonNames()));
}
for (String beanName : beanNames) {
- if (!isExcluded(beanName)) {
+ if (!isExcluded(beanName) && !isBeanDefinitionAbstract(this.beanFactory, beanName)) {
try {
Class beanClass = this.beanFactory.getType(beanName);
if (beanClass != null && callback.include(beanClass, beanName)) {
@@ -900,9 +899,6 @@ public class MBeanExporter extends MBeanRegistrationSupport
}
// otherwise ignore beans where the class is not resolvable
}
- catch (BeanIsAbstractException ex) {
- // ignore - can't expose an abstract bean
- }
}
}
}
@@ -917,6 +913,14 @@ public class MBeanExporter extends MBeanRegistrationSupport
this.excludedBeans.contains(beanName.substring(BeanFactory.FACTORY_BEAN_PREFIX.length())))));
}
+ /**
+ * Return whether the specified bean definition should be considered as abstract.
+ */
+ private boolean isBeanDefinitionAbstract(ListableBeanFactory beanFactory, String beanName) {
+ return (beanFactory instanceof ConfigurableListableBeanFactory && beanFactory.containsBeanDefinition(beanName) &&
+ ((ConfigurableListableBeanFactory) beanFactory).getBeanDefinition(beanName).isAbstract());
+ }
+
//---------------------------------------------------------------------
// Notification and listener management
diff --git a/org.springframework.context/src/test/java/org/springframework/jmx/export/autodetectMBeans.xml b/org.springframework.context/src/test/java/org/springframework/jmx/export/autodetectMBeans.xml
index 83d7ae46ad1c46c7e5cb4b0e2f00c4ed9eb2ad46..d028b5274c0ff1ff12a210a1232264ebc7f409ed 100644
--- a/org.springframework.context/src/test/java/org/springframework/jmx/export/autodetectMBeans.xml
+++ b/org.springframework.context/src/test/java/org/springframework/jmx/export/autodetectMBeans.xml
@@ -25,4 +25,6 @@
+
+