diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/CompositeHandlerMapping.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/CompositeHandlerMapping.java index cacc8674f1bb..f5240d46142b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/CompositeHandlerMapping.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/CompositeHandlerMapping.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 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. @@ -43,10 +43,7 @@ class CompositeHandlerMapping implements HandlerMapping { @Override public HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { - if (this.mappings == null) { - this.mappings = extractMappings(); - } - for (HandlerMapping mapping : this.mappings) { + for (HandlerMapping mapping : getMappings()) { HandlerExecutionChain handler = mapping.getHandler(request); if (handler != null) { return handler; @@ -55,6 +52,23 @@ public HandlerExecutionChain getHandler(HttpServletRequest request) throws Excep return null; } + @Override + public boolean usesPathPatterns() { + for (HandlerMapping mapping : getMappings()) { + if (mapping.usesPathPatterns()) { + return true; + } + } + return false; + } + + private List getMappings() { + if (this.mappings == null) { + this.mappings = extractMappings(); + } + return this.mappings; + } + private List extractMappings() { List list = new ArrayList<>(this.beanFactory.getBeansOfType(HandlerMapping.class).values()); list.remove(this); diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathSampleActuatorApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/AbstractManagementPortAndPathSampleActuatorApplicationTests.java similarity index 88% rename from spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathSampleActuatorApplicationTests.java rename to spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/AbstractManagementPortAndPathSampleActuatorApplicationTests.java index 51dd736fc8f8..578d6ebd8c07 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathSampleActuatorApplicationTests.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/AbstractManagementPortAndPathSampleActuatorApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 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. @@ -22,8 +22,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.autoconfigure.web.server.LocalManagementPort; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.core.env.Environment; @@ -33,13 +31,11 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Integration tests for separate management and main service ports. + * Base class for integration tests with separate management and main service ports. * * @author Dave Syer */ -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "management.server.port=0", - "management.endpoints.web.base-path=/admin", "management.endpoint.health.show-details=never" }) -class ManagementPortAndPathSampleActuatorApplicationTests { +abstract class AbstractManagementPortAndPathSampleActuatorApplicationTests { @LocalServerPort private int port; diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathWithAntPatcherSampleActuatorApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathWithAntPatcherSampleActuatorApplicationTests.java new file mode 100644 index 000000000000..47cebe74aaf2 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathWithAntPatcherSampleActuatorApplicationTests.java @@ -0,0 +1,32 @@ +/* + * Copyright 2012-2021 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package smoketest.actuator; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +/** + * Integration tests for separate management and main service ports. + * + * @author Dave Syer + */ +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "management.server.port=0", + "management.endpoints.web.base-path=/admin", "management.endpoint.health.show-details=never" }) +class ManagementPortAndPathWithAntPatcherSampleActuatorApplicationTests + extends AbstractManagementPortAndPathSampleActuatorApplicationTests { + +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathWithPathMatcherSampleActuatorApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathWithPathMatcherSampleActuatorApplicationTests.java new file mode 100644 index 000000000000..3f3e83a27c93 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-actuator/src/test/java/smoketest/actuator/ManagementPortAndPathWithPathMatcherSampleActuatorApplicationTests.java @@ -0,0 +1,33 @@ +/* + * Copyright 2012-2021 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package smoketest.actuator; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; + +/** + * Integration tests for separate management and main service ports. + * + * @author Dave Syer + */ +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, + properties = { "spring.mvc.pathmatch.matching-strategy=path-pattern-parser", "management.server.port=0", + "management.endpoints.web.base-path=/admin", "management.endpoint.health.show-details=never" }) +class ManagementPortAndPathWithPathMatcherSampleActuatorApplicationTests + extends AbstractManagementPortAndPathSampleActuatorApplicationTests { + +}