MBeanExporter silently ignores null beans

Issue: SPR-15031
This commit is contained in:
Juergen Hoeller
2016-12-19 16:02:59 +01:00
parent e0c43c4fcb
commit 9c55d22f78
2 changed files with 88 additions and 25 deletions

View File

@@ -39,8 +39,10 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jmx.AbstractMBeanServerTests;
@@ -68,7 +70,6 @@ import static org.junit.Assert.*;
* @author Sam Brannen
* @author Stephane Nicoll
*/
@SuppressWarnings("deprecation")
public class MBeanExporterTests extends AbstractMBeanServerTests {
@Rule
@@ -235,7 +236,6 @@ public class MBeanExporterTests extends AbstractMBeanServerTests {
assertListener(listener2);
}
@Test
public void testExportJdkProxy() throws Exception {
JmxTestBean bean = new JmxTestBean();
@@ -541,10 +541,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests {
start(exporter);
}
/**
* SPR-2158
*/
@Test
@Test // SPR-2158
public void testMBeanIsNotUnregisteredSpuriouslyIfSomeExternalProcessHasUnregisteredMBean() throws Exception {
MBeanExporter exporter = new MBeanExporter();
exporter.setBeans(getBeanMap());
@@ -561,10 +558,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests {
listener.getUnregistered().size());
}
/**
* SPR-3302
*/
@Test
@Test // SPR-3302
public void testBeanNameCanBeUsedInNotificationListenersMap() throws Exception {
String beanName = "charlesDexterWard";
BeanDefinitionBuilder testBean = BeanDefinitionBuilder.rootBeanDefinition(JmxTestBean.class);
@@ -608,10 +602,7 @@ public class MBeanExporterTests extends AbstractMBeanServerTests {
start(exporter);
}
/*
* SPR-3625
*/
@Test
@Test // SPR-3625
public void testMBeanIsUnregisteredForRuntimeExceptionDuringInitialization() throws Exception {
BeanDefinitionBuilder builder1 = BeanDefinitionBuilder.rootBeanDefinition(Person.class);
BeanDefinitionBuilder builder2 = BeanDefinitionBuilder
@@ -667,6 +658,37 @@ public class MBeanExporterTests extends AbstractMBeanServerTests {
ObjectNameManager.getInstance(secondBeanName));
}
@Test
public void testRegisterFactoryBean() throws MalformedObjectNameException {
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
factory.registerBeanDefinition("spring:type=FactoryBean", new RootBeanDefinition(ProperSomethingFactoryBean.class));
MBeanExporter exporter = new MBeanExporter();
exporter.setServer(getServer());
exporter.setBeanFactory(factory);
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL);
start(exporter);
assertIsRegistered("Non-null FactoryBean object registered",
ObjectNameManager.getInstance("spring:type=FactoryBean"));
}
@Test
public void testIgnoreNullObjectFromFactoryBean() throws MalformedObjectNameException {
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
factory.registerBeanDefinition("spring:type=FactoryBean", new RootBeanDefinition(NullSomethingFactoryBean.class));
MBeanExporter exporter = new MBeanExporter();
exporter.setServer(getServer());
exporter.setBeanFactory(factory);
exporter.setAutodetectMode(MBeanExporter.AUTODETECT_ALL);
start(exporter);
assertIsNotRegistered("Null FactoryBean object not registered",
ObjectNameManager.getInstance("spring:type=FactoryBean"));
}
private ConfigurableApplicationContext load(String context) {
return new ClassPathXmlApplicationContext(context, getClass());
}
@@ -799,4 +821,41 @@ public class MBeanExporterTests extends AbstractMBeanServerTests {
}
}
public interface SomethingMBean {}
public static class Something implements SomethingMBean {}
public static class ProperSomethingFactoryBean implements FactoryBean<Something> {
@Override public Something getObject() {
return new Something();
}
@Override public Class<?> getObjectType() {
return Something.class;
}
@Override public boolean isSingleton() {
return true;
}
}
public static class NullSomethingFactoryBean implements FactoryBean<Something> {
@Override public Something getObject() {
return null;
}
@Override public Class<?> getObjectType() {
return Something.class;
}
@Override public boolean isSingleton() {
return true;
}
}
}