3939import org .junit .rules .ExpectedException ;
4040
4141import org .springframework .aop .framework .ProxyFactory ;
42+ import org .springframework .beans .factory .FactoryBean ;
4243import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
4344import org .springframework .beans .factory .support .DefaultListableBeanFactory ;
45+ import org .springframework .beans .factory .support .RootBeanDefinition ;
4446import org .springframework .context .ConfigurableApplicationContext ;
4547import org .springframework .context .support .ClassPathXmlApplicationContext ;
4648import org .springframework .jmx .AbstractMBeanServerTests ;
6870 * @author Sam Brannen
6971 * @author Stephane Nicoll
7072 */
71- @ SuppressWarnings ("deprecation" )
7273public class MBeanExporterTests extends AbstractMBeanServerTests {
7374
7475 @ Rule
@@ -235,7 +236,6 @@ public void testWithMBeanExporterListeners() throws Exception {
235236 assertListener (listener2 );
236237 }
237238
238-
239239 @ Test
240240 public void testExportJdkProxy () throws Exception {
241241 JmxTestBean bean = new JmxTestBean ();
@@ -541,10 +541,7 @@ public void testNotRunningInBeanFactoryAndAutodetectionIsOn() throws Exception {
541541 start (exporter );
542542 }
543543
544- /**
545- * SPR-2158
546- */
547- @ Test
544+ @ Test // SPR-2158
548545 public void testMBeanIsNotUnregisteredSpuriouslyIfSomeExternalProcessHasUnregisteredMBean () throws Exception {
549546 MBeanExporter exporter = new MBeanExporter ();
550547 exporter .setBeans (getBeanMap ());
@@ -561,10 +558,7 @@ public void testMBeanIsNotUnregisteredSpuriouslyIfSomeExternalProcessHasUnregist
561558 listener .getUnregistered ().size ());
562559 }
563560
564- /**
565- * SPR-3302
566- */
567- @ Test
561+ @ Test // SPR-3302
568562 public void testBeanNameCanBeUsedInNotificationListenersMap () throws Exception {
569563 String beanName = "charlesDexterWard" ;
570564 BeanDefinitionBuilder testBean = BeanDefinitionBuilder .rootBeanDefinition (JmxTestBean .class );
@@ -608,10 +602,7 @@ public void testWildcardCanBeUsedInNotificationListenersMap() throws Exception {
608602 start (exporter );
609603 }
610604
611- /*
612- * SPR-3625
613- */
614- @ Test
605+ @ Test // SPR-3625
615606 public void testMBeanIsUnregisteredForRuntimeExceptionDuringInitialization () throws Exception {
616607 BeanDefinitionBuilder builder1 = BeanDefinitionBuilder .rootBeanDefinition (Person .class );
617608 BeanDefinitionBuilder builder2 = BeanDefinitionBuilder
@@ -667,6 +658,37 @@ public void testIgnoreBeanName() throws MalformedObjectNameException {
667658 ObjectNameManager .getInstance (secondBeanName ));
668659 }
669660
661+ @ Test
662+ public void testRegisterFactoryBean () throws MalformedObjectNameException {
663+ DefaultListableBeanFactory factory = new DefaultListableBeanFactory ();
664+ factory .registerBeanDefinition ("spring:type=FactoryBean" , new RootBeanDefinition (ProperSomethingFactoryBean .class ));
665+
666+ MBeanExporter exporter = new MBeanExporter ();
667+ exporter .setServer (getServer ());
668+ exporter .setBeanFactory (factory );
669+ exporter .setAutodetectMode (MBeanExporter .AUTODETECT_ALL );
670+
671+ start (exporter );
672+ assertIsRegistered ("Non-null FactoryBean object registered" ,
673+ ObjectNameManager .getInstance ("spring:type=FactoryBean" ));
674+ }
675+
676+ @ Test
677+ public void testIgnoreNullObjectFromFactoryBean () throws MalformedObjectNameException {
678+ DefaultListableBeanFactory factory = new DefaultListableBeanFactory ();
679+ factory .registerBeanDefinition ("spring:type=FactoryBean" , new RootBeanDefinition (NullSomethingFactoryBean .class ));
680+
681+ MBeanExporter exporter = new MBeanExporter ();
682+ exporter .setServer (getServer ());
683+ exporter .setBeanFactory (factory );
684+ exporter .setAutodetectMode (MBeanExporter .AUTODETECT_ALL );
685+
686+ start (exporter );
687+ assertIsNotRegistered ("Null FactoryBean object not registered" ,
688+ ObjectNameManager .getInstance ("spring:type=FactoryBean" ));
689+ }
690+
691+
670692 private ConfigurableApplicationContext load (String context ) {
671693 return new ClassPathXmlApplicationContext (context , getClass ());
672694 }
@@ -799,4 +821,41 @@ public boolean includeBean(Class<?> beanClass, String beanName) {
799821 }
800822 }
801823
824+
825+ public interface SomethingMBean {}
826+
827+ public static class Something implements SomethingMBean {}
828+
829+
830+ public static class ProperSomethingFactoryBean implements FactoryBean <Something > {
831+
832+ @ Override public Something getObject () {
833+ return new Something ();
834+ }
835+
836+ @ Override public Class <?> getObjectType () {
837+ return Something .class ;
838+ }
839+
840+ @ Override public boolean isSingleton () {
841+ return true ;
842+ }
843+ }
844+
845+
846+ public static class NullSomethingFactoryBean implements FactoryBean <Something > {
847+
848+ @ Override public Something getObject () {
849+ return null ;
850+ }
851+
852+ @ Override public Class <?> getObjectType () {
853+ return Something .class ;
854+ }
855+
856+ @ Override public boolean isSingleton () {
857+ return true ;
858+ }
859+ }
860+
802861}
0 commit comments