diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/EndpointServlet.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/EndpointServlet.java index 44239b2fde..a3abd5e9ae 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/EndpointServlet.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/EndpointServlet.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.Servlet; +import javax.servlet.ServletRegistration; import org.springframework.beans.BeanUtils; import org.springframework.util.Assert; @@ -30,6 +31,7 @@ import org.springframework.util.StringUtils; * Contains details of a servlet that is exposed as an actuator endpoint. * * @author Phillip Webb + * @author Julio José Gómez Díaz */ public final class EndpointServlet { @@ -37,21 +39,27 @@ public final class EndpointServlet { private final Map initParameters; + private final int loadOnStartup; + public EndpointServlet(Class servlet) { + this(instantiateClass(servlet)); + } + + private static Servlet instantiateClass(Class servlet) { Assert.notNull(servlet, "Servlet must not be null"); - this.servlet = BeanUtils.instantiateClass(servlet); - this.initParameters = Collections.emptyMap(); + return BeanUtils.instantiateClass(servlet); } public EndpointServlet(Servlet servlet) { - Assert.notNull(servlet, "Servlet must not be null"); - this.servlet = servlet; - this.initParameters = Collections.emptyMap(); + this(servlet, Collections.emptyMap(), -1); } - private EndpointServlet(Servlet servlet, Map initParameters) { + private EndpointServlet(Servlet servlet, Map initParameters, + int loadOnStartup) { + Assert.notNull(servlet, "Servlet must not be null"); this.servlet = servlet; this.initParameters = Collections.unmodifiableMap(initParameters); + this.loadOnStartup = loadOnStartup; } public EndpointServlet withInitParameter(String name, String value) { @@ -67,7 +75,21 @@ public final class EndpointServlet { Map mergedInitParameters = new LinkedHashMap<>( this.initParameters); mergedInitParameters.putAll(initParameters); - return new EndpointServlet(this.servlet, mergedInitParameters); + return new EndpointServlet(this.servlet, mergedInitParameters, + this.loadOnStartup); + } + + /** + * Sets the {@code loadOnStartup} priority that will be set on Servlet registration. + * The default value for {@code loadOnStartup} is {@code -1}. + * @param loadOnStartup the initialization priority of the Servlet + * @return a new instance of {@link EndpointServlet} with the provided + * {@code loadOnStartup} value set + * @since 2.2.0 + * @see ServletRegistration.Dynamic#setLoadOnStartup(int) + */ + public EndpointServlet withLoadOnStartup(int loadOnStartup) { + return new EndpointServlet(this.servlet, this.initParameters, loadOnStartup); } Servlet getServlet() { @@ -78,4 +100,8 @@ public final class EndpointServlet { return this.initParameters; } + int getLoadOnStartup() { + return this.loadOnStartup; + } + } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrar.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrar.java index dec24a8794..ade3db9a9e 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrar.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrar.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,6 +75,7 @@ public class ServletEndpointRegistrar implements ServletContextInitializer { endpointServlet.getServlet()); registration.addMapping(urlMapping); registration.setInitParameters(endpointServlet.getInitParameters()); + registration.setLoadOnStartup(endpointServlet.getLoadOnStartup()); logger.info("Registered '" + path + "' to " + name); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/EndpointServletTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/EndpointServletTests.java index 229d651b37..6d03625a43 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/EndpointServletTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/EndpointServletTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,12 @@ package org.springframework.boot.actuate.endpoint.web; -import java.io.IOException; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.GenericServlet; import javax.servlet.Servlet; -import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @@ -129,14 +127,25 @@ public class EndpointServletTests { extra.put("e", "f"); assertThat(endpointServlet.withInitParameters(extra).getInitParameters()) .containsExactly(entry("a", "b1"), entry("c", "d"), entry("e", "f")); + } + @Test + public void withLoadOnStartupNotSetShouldReturnDefaultValue() { + EndpointServlet endpointServlet = new EndpointServlet(TestServlet.class); + assertThat(endpointServlet.getLoadOnStartup()).isEqualTo(-1); + } + + @Test + public void withLoadOnStartupSetShouldReturnValue() { + EndpointServlet endpointServlet = new EndpointServlet(TestServlet.class) + .withLoadOnStartup(3); + assertThat(endpointServlet.getLoadOnStartup()).isEqualTo(3); } private static class TestServlet extends GenericServlet { @Override - public void service(ServletRequest req, ServletResponse res) - throws ServletException, IOException { + public void service(ServletRequest req, ServletResponse res) { } } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrarTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrarTests.java index 399ace063d..62f4a44bed 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrarTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/web/ServletEndpointRegistrarTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 the original author or authors. + * Copyright 2012-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -120,6 +120,28 @@ public class ServletEndpointRegistrarTests { verify(this.dynamic).setInitParameters(Collections.singletonMap("a", "b")); } + @Test + public void onStartupWhenHasLoadOnStartupShouldRegisterLoadOnStartup() + throws Exception { + ExposableServletEndpoint endpoint = mockEndpoint( + new EndpointServlet(TestServlet.class).withLoadOnStartup(7)); + ServletEndpointRegistrar registrar = new ServletEndpointRegistrar("/actuator", + Collections.singleton(endpoint)); + registrar.onStartup(this.servletContext); + verify(this.dynamic).setLoadOnStartup(7); + } + + @Test + public void onStartupWhenHasNotLoadOnStartupShouldRegisterDefaultValue() + throws Exception { + ExposableServletEndpoint endpoint = mockEndpoint( + new EndpointServlet(TestServlet.class)); + ServletEndpointRegistrar registrar = new ServletEndpointRegistrar("/actuator", + Collections.singleton(endpoint)); + registrar.onStartup(this.servletContext); + verify(this.dynamic).setLoadOnStartup(-1); + } + private ExposableServletEndpoint mockEndpoint(EndpointServlet endpointServlet) { ExposableServletEndpoint endpoint = mock(ExposableServletEndpoint.class); given(endpoint.getEndpointId()).willReturn(EndpointId.of("test"));