Use ServletWrappingController for jolokia instead of Servlet
We get more control over the handling and in particular the registration of the endpoint this way. It was practically impossible to disable the AgentServlet bean when in a parent context of the management server because of lifecyce issues - you don't know that the user wants a separate management server until too late. This approach also makes it possible to test with spring-test MVC support.
This commit is contained in:
@@ -16,26 +16,21 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import javax.servlet.Servlet;
|
||||
import javax.servlet.ServletRegistration;
|
||||
|
||||
import org.jolokia.http.AgentServlet;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.TestUtils;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.JolokiaMvcEndpoint;
|
||||
import org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
|
||||
import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
|
||||
import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory;
|
||||
import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory.RegisteredServlet;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
/**
|
||||
* Tests for {@link JolokiaAutoConfiguration}.
|
||||
@@ -64,7 +59,7 @@ public class JolokiaAutoConfigurationTests {
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
JolokiaAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
assertEquals(1, this.context.getBeanNamesForType(AgentServlet.class).length);
|
||||
assertEquals(1, this.context.getBeanNamesForType(JolokiaMvcEndpoint.class).length);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -76,29 +71,7 @@ public class JolokiaAutoConfigurationTests {
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
JolokiaAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
assertEquals(0, this.context.getBeanNamesForType(AgentServlet.class).length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void agentServletRegisteredWithServletContainer() throws Exception {
|
||||
this.context = new AnnotationConfigEmbeddedWebApplicationContext();
|
||||
this.context.register(Config.class, WebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
JolokiaAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
|
||||
Servlet servlet = null;
|
||||
ServletRegistration.Dynamic registration = null;
|
||||
for (RegisteredServlet registeredServlet : Config.containerFactory.getContainer()
|
||||
.getRegisteredServlets()) {
|
||||
if (registeredServlet.getServlet() instanceof AgentServlet) {
|
||||
servlet = registeredServlet.getServlet();
|
||||
registration = registeredServlet.getRegistration();
|
||||
}
|
||||
}
|
||||
assertNotNull(servlet);
|
||||
assertNotNull(registration);
|
||||
assertEquals(0, this.context.getBeanNamesForType(JolokiaMvcEndpoint.class).length);
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.TestUtils;
|
||||
import org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration;
|
||||
import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpointTests.TestConfiguration;
|
||||
import org.springframework.boot.test.SpringApplicationConfiguration;
|
||||
@@ -73,7 +74,8 @@ public class EnvironmentMvcEndpointTests {
|
||||
.andExpect(content().string(equalToIgnoringCase("bar")));
|
||||
}
|
||||
|
||||
@Import(EndpointWebMvcAutoConfiguration.class)
|
||||
@Import({ EndpointWebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
@EnableWebMvc
|
||||
@Configuration
|
||||
public static class TestConfiguration {
|
||||
|
||||
@@ -16,21 +16,35 @@
|
||||
|
||||
package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.TestUtils;
|
||||
import org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.JolokiaAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.JolokiaEndpointTests.Config;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.test.SpringApplicationConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.context.web.WebAppConfiguration;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
/**
|
||||
* @author Christian Dupuis
|
||||
@@ -44,21 +58,49 @@ public class JolokiaEndpointTests {
|
||||
@Autowired
|
||||
private MvcEndpoints endpoints;
|
||||
|
||||
@Autowired
|
||||
private WebApplicationContext context;
|
||||
|
||||
private MockMvc mvc;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
|
||||
TestUtils.addEnviroment((ConfigurableApplicationContext) this.context, "foo:bar");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void endpointRegistered() throws Exception {
|
||||
assertEquals(1, this.endpoints.getEndpoints().size());
|
||||
Set<? extends MvcEndpoint> values = this.endpoints.getEndpoints();
|
||||
assertEquals(1, values.size());
|
||||
assertTrue(values.iterator().next() instanceof JolokiaMvcEndpoint);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void search() throws Exception {
|
||||
this.mvc.perform(get("/jolokia/search/java.lang:*")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("GarbageCollector")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void read() throws Exception {
|
||||
this.mvc.perform(get("/jolokia/read/java.lang:type=Memory"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void list() throws Exception {
|
||||
this.mvc.perform(get("/jolokia/list/java.lang/type=Memory/attr"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
@EnableWebMvc
|
||||
@Import(EndpointWebMvcAutoConfiguration.class)
|
||||
@Import({ EndpointWebMvcAutoConfiguration.class, JolokiaAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
public static class Config {
|
||||
|
||||
@Bean
|
||||
public JolokiaMvcEndpoint endpoint() {
|
||||
return new JolokiaMvcEndpoint();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +112,6 @@ public class BasicErrorControllerSpecialIntegrationTests {
|
||||
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class,
|
||||
ManagementSecurityAutoConfiguration.class })
|
||||
protected static class ChildConfiguration {
|
||||
|
||||
// For manual testing
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(ParentConfiguration.class).child(
|
||||
|
||||
Reference in New Issue
Block a user