Repository: springdoc/springdoc-openapi
Pull request #345 (2020-01-14 16:34:00)

Improve Actuator documentation
Improve actuator documentation:
- Add operation summary
- Add "Tag detail" with link to the spring documentation
- Fix duplicate operation id (duplicate 'handle' operation id)

![image](https://user-images.githubusercontent.com/995890/72362493-900dd580-36f3-11ea-88bf-1b2dc1944c5f.png)



Patch:
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/Constants.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/Constants.java
index 9a251d54c..f60cd4a82 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/Constants.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/Constants.java
@@ -25,6 +25,9 @@ public final class Constants {
     public static final String SPRINGDOC_PACKAGES_TO_SCAN = "${springdoc.packages-to-scan:#{null}}";
     public static final String SPRINGDOC_PATHS_TO_MATCH = "${springdoc.paths-to-match:#{null}}";
     public static final String SPRINGDOC_ACTUATOR_TAG = "Actuator";
+    public static final String SPRINGDOC_ACTUATOR_DESCRIPTION = "Monitor and interact";
+    public static final String SPRINGDOC_ACTUATOR_DOC_URL = "https://docs.spring.io/spring-boot/docs/current/actuator-api/html/";
+    public static final String SPRINGDOC_ACTUATOR_DOC_DESCRIPTION = "Spring Boot Actuator Web API Documentation";
     public static final String DEFAULT_WEB_JARS_PREFIX_URL = "/webjars";
     public static final String WEB_JARS_PREFIX_URL = "${springdoc.webjars.prefix:#{T(org.springdoc.core.Constants).DEFAULT_WEB_JARS_PREFIX_URL}}";
     public static final String SWAGGER_UI_URL = "/swagger-ui/index.html";
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java
index ad0dc5f23..8aee2bbea 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java
@@ -27,11 +27,20 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.method.HandlerMethod;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import static org.springdoc.core.Constants.*;
+import static org.springdoc.core.Constants.DEFAULT_SERVER_DESCRIPTION;
+import static org.springdoc.core.Constants.DEFAULT_TITLE;
+import static org.springdoc.core.Constants.DEFAULT_VERSION;
 
 public class OpenAPIBuilder {
 
@@ -40,7 +49,7 @@ public class OpenAPIBuilder {
     private boolean isServersPresent = false;
     private final ApplicationContext context;
     private final SecurityParser securityParser;
-    private final Map<HandlerMethod, String> springdocTags = new HashMap<>();
+    private final Map<HandlerMethod, io.swagger.v3.oas.models.tags.Tag> springdocTags = new HashMap<>();
     private String serverBaseUrl;
     private final Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider;
 
@@ -130,8 +139,13 @@ public class OpenAPIBuilder {
             allTags.addAll(classTags);
         }
 
-        if (springdocTags.containsKey(handlerMethod))
-            tagsStr.add(springdocTags.get(handlerMethod));
+        if (springdocTags.containsKey(handlerMethod)) {
+            io.swagger.v3.oas.models.tags.Tag tag = springdocTags.get(handlerMethod);
+            tagsStr.add(tag.getName());
+            if(openAPI.getTags() == null || !openAPI.getTags().contains(tag)) {
+                openAPI.addTagsItem(tag);
+            }
+        }
 
         Optional<Set<io.swagger.v3.oas.models.tags.Tag>> tags = AnnotationsUtils
                 .getTags(allTags.toArray(new Tag[0]), true);
@@ -300,8 +314,8 @@ public class OpenAPIBuilder {
         return apiSecurityScheme;
     }
 
-    public void addTag(Set<HandlerMethod> handlerMethods, String tagName) {
-        handlerMethods.forEach(handlerMethod -> springdocTags.put(handlerMethod, tagName));
+    public void addTag(Set<HandlerMethod> handlerMethods, io.swagger.v3.oas.models.tags.Tag tag) {
+        handlerMethods.forEach(handlerMethod -> springdocTags.put(handlerMethod, tag));
     }
 
     public Map<String, Object> getRestControllersMap() {
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/ActuatorProvider.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/ActuatorProvider.java
index 11ddfd426..dc08175f6 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/ActuatorProvider.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/ActuatorProvider.java
@@ -1,6 +1,15 @@
 package org.springdoc.api;
 
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.tags.Tag;
+import org.springdoc.core.Constants;
 import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
+
+import java.util.Map;
+
 
 public class ActuatorProvider {
 
@@ -10,8 +19,24 @@ public class ActuatorProvider {
         this.webMvcEndpointHandlerMapping = webMvcEndpointHandlerMapping;
     }
 
-    public WebMvcEndpointHandlerMapping getWebMvcHandlerMapping() {
-        return webMvcEndpointHandlerMapping;
+    public Map<RequestMappingInfo, HandlerMethod> getMethods() {
+        return  webMvcEndpointHandlerMapping.getHandlerMethods();
+    }
+
+    public Tag getTag() {
+        Tag actuatorTag = new Tag();
+        actuatorTag.setName(Constants.SPRINGDOC_ACTUATOR_TAG);
+        actuatorTag.setDescription(Constants.SPRINGDOC_ACTUATOR_DESCRIPTION);
+        actuatorTag.setExternalDocs(
+                new ExternalDocumentation()
+                        .url(Constants.SPRINGDOC_ACTUATOR_DOC_URL)
+                        .description(Constants.SPRINGDOC_ACTUATOR_DOC_DESCRIPTION)
+        );
+        return actuatorTag;
+    }
+
+    public boolean isRestController(Map<String, Object> restControllers, HandlerMethod handlerMethod, String operationPath) {
+        return operationPath.startsWith(AntPathMatcher.DEFAULT_PATH_SEPARATOR);
     }
 
 }
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/MultipleOpenApiResource.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/MultipleOpenApiResource.java
index 6b5395d05..d2d832500 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/MultipleOpenApiResource.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/MultipleOpenApiResource.java
@@ -2,7 +2,11 @@ package org.springdoc.api;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import io.swagger.v3.oas.annotations.Operation;
-import org.springdoc.core.*;
+import org.springdoc.core.AbstractRequestBuilder;
+import org.springdoc.core.AbstractResponseBuilder;
+import org.springdoc.core.GroupedOpenApi;
+import org.springdoc.core.OpenAPIBuilder;
+import org.springdoc.core.OperationBuilder;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.ObjectFactory;
 import org.springframework.beans.factory.annotation.Value;
@@ -18,7 +22,10 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
-import static org.springdoc.core.Constants.*;
+import static org.springdoc.core.Constants.API_DOCS_URL;
+import static org.springdoc.core.Constants.APPLICATION_OPENAPI_YAML;
+import static org.springdoc.core.Constants.DEFAULT_API_DOCS_URL_YAML;
+import static org.springdoc.core.Constants.SPRINGDOC_CACHE_DISABLED_VALUE;
 import static org.springframework.util.AntPathMatcher.DEFAULT_PATH_SEPARATOR;
 
 @RestController
@@ -32,8 +39,6 @@ public class MultipleOpenApiResource implements InitializingBean {
     private final RequestMappingInfoHandlerMapping requestMappingHandlerMapping;
     private final Optional<ActuatorProvider> servletContextProvider;
     private Map<String, OpenApiResource> groupedOpenApiResources;
-    @Value(SPRINGDOC_SHOW_ACTUATOR_VALUE)
-    private boolean showActuator;
     @Value(SPRINGDOC_CACHE_DISABLED_VALUE)
     private boolean cacheDisabled;
 
@@ -63,7 +68,6 @@ public class MultipleOpenApiResource implements InitializingBean {
                                 requestMappingHandlerMapping,
                                 servletContextProvider,
                                 Optional.of(item.getOpenApiCustomisers()), item.getPathsToMatch(), item.getPackagesToScan(),
-                                showActuator,
                                 cacheDisabled
                         )
                 ));
@@ -93,4 +97,4 @@ public class MultipleOpenApiResource implements InitializingBean {
         }
         return openApiResource;
     }
-}
\ No newline at end of file
+}
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java
index 1901aff9c..056c9273d 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java
@@ -8,7 +8,11 @@ import io.swagger.v3.core.util.Yaml;
 import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.models.OpenAPI;
-import org.springdoc.core.*;
+import org.springdoc.core.AbstractRequestBuilder;
+import org.springdoc.core.AbstractResponseBuilder;
+import org.springdoc.core.OpenAPIBuilder;
+import org.springdoc.core.OperationBuilder;
+import org.springdoc.core.SecurityOAuth2Provider;
 import org.springdoc.core.customizers.OpenApiCustomiser;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.annotation.AnnotationUtils;
@@ -23,9 +27,16 @@ import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
 import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
-
-import static org.springdoc.core.Constants.*;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.springdoc.core.Constants.API_DOCS_URL;
+import static org.springdoc.core.Constants.APPLICATION_OPENAPI_YAML;
+import static org.springdoc.core.Constants.DEFAULT_API_DOCS_URL_YAML;
 import static org.springframework.util.AntPathMatcher.DEFAULT_PATH_SEPARATOR;
 
 @RestController
@@ -35,9 +46,6 @@ public class OpenApiResource extends AbstractOpenApiResource {
 
     private final Optional<ActuatorProvider> servletContextProvider;
 
-    @Value(SPRINGDOC_SHOW_ACTUATOR_VALUE)
-    private boolean showActuator;
-
     public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
                            AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
                            RequestMappingInfoHandlerMapping requestMappingHandlerMapping, Optional<ActuatorProvider> servletContextProvider,
@@ -51,11 +59,10 @@ public class OpenApiResource extends AbstractOpenApiResource {
                            AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
                            RequestMappingInfoHandlerMapping requestMappingHandlerMapping, Optional<ActuatorProvider> servletContextProvider,
                            Optional<List<OpenApiCustomiser>> openApiCustomisers, List<String> pathsToMatch, List<String> packagesToScan,
-                           boolean showActuator,boolean cacheDisabled) {
-        super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, openApiCustomisers, pathsToMatch, packagesToScan,cacheDisabled);
+                           boolean cacheDisabled) {
+        super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, openApiCustomisers, pathsToMatch, packagesToScan, cacheDisabled);
         this.requestMappingHandlerMapping = requestMappingHandlerMapping;
         this.servletContextProvider = servletContextProvider;
-        this.showActuator = showActuator;
     }
 
     @Operation(hidden = true)
@@ -79,23 +86,23 @@ public class OpenApiResource extends AbstractOpenApiResource {
     @Override
     protected void getPaths(Map<String, Object> restControllers) {
         Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
-        calculatePath(restControllers, map);
-        if (showActuator && servletContextProvider.isPresent()) {
-            map = servletContextProvider.get().getWebMvcHandlerMapping().getHandlerMethods();
-            Set<HandlerMethod> handlerMethods = new HashSet<>(map.values());
-            this.openAPIBuilder.addTag(handlerMethods, SPRINGDOC_ACTUATOR_TAG);
-            calculatePath(restControllers, map);
+        calculatePath(restControllers, map, Optional.empty());
+
+        if (servletContextProvider.isPresent()){
+            map = servletContextProvider.get().getMethods();
+            this.openAPIBuilder.addTag(new HashSet<>(map.values()), servletContextProvider.get().getTag());
+            calculatePath(restControllers, map, servletContextProvider);
         }
         Optional<SecurityOAuth2Provider>  securityOAuth2ProviderOptional = openAPIBuilder.getSpringSecurityOAuth2Provider();
         if (securityOAuth2ProviderOptional.isPresent()) {
             SecurityOAuth2Provider securityOAuth2Provider = securityOAuth2ProviderOptional.get();
             Map<RequestMappingInfo, HandlerMethod> mapOauth = securityOAuth2Provider.getHandlerMethods();
             Map<String, Object> requestMappingMapSec = securityOAuth2Provider.getFrameworkEndpoints();
-            calculatePath(requestMappingMapSec, mapOauth);
+            calculatePath(requestMappingMapSec, mapOauth, Optional.empty());
         }
     }
 
-    private void calculatePath(Map<String, Object> restControllers, Map<RequestMappingInfo, HandlerMethod> map) {
+    private void calculatePath(Map<String, Object> restControllers, Map<RequestMappingInfo, HandlerMethod> map, Optional<ActuatorProvider> actuatorProvider) {
         for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : map.entrySet()) {
             RequestMappingInfo requestMappingInfo = entry.getKey();
             HandlerMethod handlerMethod = entry.getValue();
@@ -104,7 +111,10 @@ public class OpenApiResource extends AbstractOpenApiResource {
             Map<String, String> regexMap = new LinkedHashMap<>();
             for (String pattern : patterns) {
                 String operationPath = PathUtils.parsePath(pattern, regexMap);
-                if (isRestController(restControllers, handlerMethod, operationPath) && isPackageToScan(handlerMethod.getBeanType().getPackage().getName()) && isPathToMatch(operationPath)) {
+                if ( ((actuatorProvider.isPresent() && actuatorProvider.get().isRestController(restControllers, handlerMethod, operationPath))
+                        || isRestController(restControllers, handlerMethod, operationPath))
+                        && isPackageToScan(handlerMethod.getBeanType().getPackage().getName())
+                        && isPathToMatch(operationPath)) {
                     Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
                     calculatePath(openAPIBuilder, handlerMethod, operationPath, requestMethods);
                 }
@@ -114,21 +124,13 @@ public class OpenApiResource extends AbstractOpenApiResource {
 
     private boolean isRestController(Map<String, Object> restControllers, HandlerMethod handlerMethod,
                                      String operationPath) {
-        boolean result;
-        if (showActuator)
-            result = operationPath.startsWith(DEFAULT_PATH_SEPARATOR);
-        else {
-            ResponseBody responseBodyAnnotation = ReflectionUtils.getAnnotation(handlerMethod.getBeanType(),
-                    ResponseBody.class);
-
-            if (responseBodyAnnotation == null)
-                responseBodyAnnotation = ReflectionUtils.getAnnotation(handlerMethod.getMethod(), ResponseBody.class);
-            result = operationPath.startsWith(DEFAULT_PATH_SEPARATOR)
-                    && (restControllers.containsKey(handlerMethod.getBean().toString())
-                    || (responseBodyAnnotation != null && AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Hidden.class) == null));
-        }
+        ResponseBody responseBodyAnnotation = ReflectionUtils.getAnnotation(handlerMethod.getBeanType(), ResponseBody.class);
 
-        return result;
+        if (responseBodyAnnotation == null)
+            responseBodyAnnotation = ReflectionUtils.getAnnotation(handlerMethod.getMethod(), ResponseBody.class);
+        return operationPath.startsWith(DEFAULT_PATH_SEPARATOR)
+                && (restControllers.containsKey(handlerMethod.getBean().toString())
+                || (responseBodyAnnotation != null && AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Hidden.class) == null));
     }
 
     private void calculateServerUrl(HttpServletRequest request, String apiDocsUrl) {
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java
index 779f20dbd..630391f78 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java
@@ -1,5 +1,6 @@
 package org.springdoc.core;
 
+import io.swagger.v3.oas.models.Operation;
 import org.springdoc.api.ActuatorProvider;
 import org.springdoc.api.OpenApiResource;
 import org.springdoc.core.customizers.OpenApiCustomiser;
@@ -13,6 +14,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.web.method.HandlerMethod;
 import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
 
 import java.util.List;
@@ -67,6 +69,22 @@ public class SpringDocWebMvcConfiguration {
             return new ActuatorProvider(webMvcEndpointHandlerMapping);
         }
 
-    }
+        @Bean
+        public OperationCustomizer ActuatorCustomizer(ActuatorProvider actuatorProvider){
+            return new OperationCustomizer() {
+
+                private int methodCount;
 
+                @Override
+                public Operation customize(Operation operation, HandlerMethod handlerMethod) {
+                    if(operation.getTags() != null && operation.getTags().contains(actuatorProvider.getTag().getName())) {
+                        operation.setSummary(handlerMethod.toString());
+                        operation.setOperationId(operation.getOperationId()+"_"+methodCount++);
+                    }
+                    return operation;
+                }
+            };
+        }
+
+    }
 }


Test patch:
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app68/SpringDocApp68Test.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app68/SpringDocApp68Test.java
index f3871c993..5dd8c9fdd 100644
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app68/SpringDocApp68Test.java
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app68/SpringDocApp68Test.java
@@ -1,5 +1,6 @@
 package test.org.springdoc.api.app68;
 
+import org.hamcrest.Matchers;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springdoc.core.Constants;
@@ -10,10 +11,14 @@ import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
 
+import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 import static test.org.springdoc.api.app68.FileUtils.getContent;
 
 @RunWith(SpringRunner.class)
@@ -62,6 +67,20 @@ public class SpringDocApp68Test {
     @Test
     public void testActuator() throws Exception {
         mockMvc.perform(get(Constants.DEFAULT_API_DOCS_URL)).andExpect(status().isOk())
-                .andExpect(jsonPath("$.openapi", is("3.0.1"))).andExpect(jsonPath("$.paths./actuator/info.get.operationId", containsString("handle"))).andExpect(jsonPath("$.paths./actuator/health.get.operationId", containsString("handle")));
+                .andExpect(jsonPath("$.openapi", is("3.0.1")))
+                .andExpect(jsonPath("$.paths./actuator/info.get.operationId", containsString("handle_")))
+                .andExpect(jsonPath("$.paths./actuator/info.get.summary", Matchers.is("Actuator web endpoint 'info'")))
+                .andExpect(jsonPath("$.paths./actuator/health.get.operationId", containsString("handle_")));
+    }
+
+    @Test
+    public void testActuatorDescription() throws Exception {
+        mockMvc.perform(get(Constants.DEFAULT_API_DOCS_URL)).andExpect(status().isOk())
+                .andExpect(jsonPath("$.openapi", is("3.0.1")))
+                .andExpect(jsonPath("$.tags", hasSize(4)))
+                .andExpect(jsonPath("$.tags[?(@.name == '"+Constants.SPRINGDOC_ACTUATOR_TAG+"')].name", contains(Constants.SPRINGDOC_ACTUATOR_TAG)))
+                .andExpect(jsonPath("$.tags[?(@.name == '"+Constants.SPRINGDOC_ACTUATOR_TAG+"')].description", contains(Constants.SPRINGDOC_ACTUATOR_DESCRIPTION)))
+                .andExpect(jsonPath("$.tags[?(@.name == '"+Constants.SPRINGDOC_ACTUATOR_TAG+"')].externalDocs.description", contains(Constants.SPRINGDOC_ACTUATOR_DOC_DESCRIPTION)))
+                .andExpect(jsonPath("$.tags[?(@.name == '"+Constants.SPRINGDOC_ACTUATOR_TAG+"')].externalDocs.url", contains(Constants.SPRINGDOC_ACTUATOR_DOC_URL)));
     }
 }