Spring boot получить все сопоставления запросов, путь, параметры, тип ответа

Я хочу получить все сопоставления запросов. Включите сопоставление моего контроллера, сопоставление фильтров и сопоставление фреймворка. Это похоже на весеннюю загрузку spring boot actuator /actuator/mappings, но я не знаю, как получить все сопоставления из исходников. И мне нужно сопоставление запроса с типом параметра и типом ответа.

Я пытаюсь использовать этот метод:

  1. RequestMappingHandlerMapping: он получит сопоставления контроллеров.
  2. Я обнаружил, что ручка актуатора есть org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler#handle, но я не знаю, как ею пользоваться.
  3. org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints: он получит пустой список или базовый путь с /actuator.

Как мне это сделать? Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вопрос был решён.

Методы отказа

Я пытаюсь использовать этот метод для получения сопоставлений сервлетов, но безуспешно.

  1. Введите эти открытия: 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 [].

Эти пути неполные.

  1. Введите 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 [/]

Кажется, он является базовым путем сервлета.

  1. Введите 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()

Он включает только пути контроллера. Мне нужно, чтобы все пути сопоставления.

  1. Внедрить 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.DispatcherServletMappingDetails
  • org.springframework.boot.actuate.web.mappings.HandlerMethodDescription

Другие вопросы по теме