Я хочу получить все сопоставления запросов. Включите сопоставление моего контроллера, сопоставление фильтров и сопоставление фреймворка. Это похоже на весеннюю загрузку spring boot actuator /actuator/mappings, но я не знаю, как получить все сопоставления из исходников. И мне нужно сопоставление запроса с типом параметра и типом ответа.
Я пытаюсь использовать этот метод:
RequestMappingHandlerMapping: он получит сопоставления контроллеров.org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler#handle, но я не знаю, как ею пользоваться.org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints: он получит пустой список или базовый путь с /actuator.Как мне это сделать? Спасибо




Вопрос был решён.
Я пытаюсь использовать этот метод для получения сопоставлений сервлетов, но безуспешно.
ControllerEndpointDiscoverer, WebEndpointDiscoverer и ServletEndpointDiscoverer. И инициализируйте endpoint следующим образом:PathMappedEndpoints pathMappedEndpoints = new PathMappedEndpoints(null, servletEndpointDiscoverer);
PathMappedEndpoints webEndpoints = new PathMappedEndpoints(null, webEndpointDiscoverer);
PathMappedEndpoints controllerEndpoints = new PathMappedEndpoints(null, controllerEndpointDiscoverer);
log.info("All path endpoints {}.", pathMappedEndpoints.getAllPaths());
log.info("All web endpoints {}.", webEndpoints.getAllPaths());
log.info("All controller endpoints {}.", controllerEndpoints.getAllPaths());
Выход:
2022-10-10T23:15:17.381+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: All path endpoints [].
2022-10-10T23:15:17.382+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: All web endpoints [/beans, /caches, /health, /info, /conditions, /configprops, /env, /loggers, /heapdump, /threaddump, /metrics, /scheduledtasks, /mappings].
2022-10-10T23:15:17.382+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: All controller endpoints [].
Эти пути неполные.
WebApplicationContext и получите ServletRegistration карту:Map<String, ? extends ServletRegistration> servletRegistrations = webApplicationContext.getServletContext().getServletRegistrations();
servletRegistrations.forEach((key, value) -> log.info("key {}, value {}", key, value.getMappings()));
Выход:
2022-10-10T23:15:17.384+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: key dispatcherServlet, value [/]
Кажется, он является базовым путем сервлета.
RequestMappingHandlerMapping и getHandlerMethods:Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
handlerMethods.forEach((key, value) -> log.info("key {}, value {}", key.getName(), value.getMethod()));
Выход
2022-10-10T23:15:17.385+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: key null, value public org.springframework.http.HttpEntity wiki.lever.controller.AuthorizationController.tokenInfo(org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken)
2022-10-10T23:15:17.385+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: key null, value public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse)
2022-10-10T23:15:17.385+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: key null, value public org.springframework.http.ResponseEntity org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(jakarta.servlet.http.HttpServletRequest)
2022-10-10T23:15:17.386+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: key null, value public org.springframework.http.HttpEntity wiki.lever.controller.HelloController.hello(java.lang.String,int)
2022-10-10T23:15:17.386+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: key null, value public org.springframework.http.HttpEntity wiki.lever.controller.HelloController.word()
2022-10-10T23:15:17.386+08:00 INFO 49374 --- [nio-9001-exec-1] w.l...: key null, value public org.springframework.http.HttpEntity wiki.lever.controller.InformationController.mapping()
Он включает только пути контроллера. Мне нужно, чтобы все пути сопоставления.
ExposableWebEndpoint коллекцию.for (ExposableWebEndpoint endpoint : endpoints) {
for (WebOperation operation : endpoint.getOperations()) {
String path = operation.getRequestPredicate().getPath();
log.info("Path {}", path);
}
}
Ничего не выводится. И конечные точки включают только путь привода.
Прочтите org.springframework.boot:spring-boot-starter-actuator источник, я обнаружил, что обработчик /actuator/mappings — это org.springframework.boot.actuate.web.mappings.MappingsEndpoint#mappings. А сопоставления происходят из descriptionProviders.
Итак, вводим Collection<MappingDescriptionProvider>:
DispatcherServletsMappingDescriptionProvider servletMappingProvider = descriptionProviders.stream()
.filter(DispatcherServletsMappingDescriptionProvider.class::isInstance)
.map(DispatcherServletsMappingDescriptionProvider.class::cast)
.findFirst().orElseThrow(() -> new SystemException("Can not find dispatcher servlet mapping provider."));
Map<String, List<DispatcherServletMappingDescription>> mappingDesciptionMaps = servletMappingProvider.describeMappings(webApplicationContext);
for (List<DispatcherServletMappingDescription> descriptionList : mappingDesciptionMaps.values()) {
descriptionList.stream()
.map(DispatcherServletMappingDescription::getDetails)
.filter(Objects::nonNull)
.map(details -> details.getRequestMappingConditions().getPatterns())
.flatMap(Collection::stream)
.forEach(pattern -> log.info("mapping pattern {}", pattern));
}
Выход
2022-10-10T23:54:42.613+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/mappings
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/loggers
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/env
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/metrics
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/metrics/{requiredMetricName}
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/caches
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/threaddump
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/threaddump
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/caches/{cache}
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/configprops
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/health
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/info
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/configprops/{prefix}
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/loggers/{name}
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/caches/{cache}
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/caches
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/loggers/{name}
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/health/**
2022-10-10T23:54:42.614+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/beans
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/env/{toMatch}
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/conditions
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/scheduledtasks
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /actuator/heapdump
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /information/mapping
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /authorization/tokenInfo
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /error
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /error
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /word
2022-10-10T23:54:42.615+08:00 INFO 51806 --- [nio-9001-exec-2] w.l...: mapping pattern /hello
Сопоставления включают контроллер, фильтр и многое другое.
И я могу получить метод или другую информацию. Я думаю, что метод лучший.
Ссылки:
org.springframework.boot.actuate.web.mappings.servlet.DispatcherServletMappingDetailsorg.springframework.boot.actuate.web.mappings.HandlerMethodDescription