Java Spring:检查给定端点是否存在

Java Spring:检查给定端点是否存在,java,spring,spring-boot,Java,Spring,Spring Boot,就像标题一样。我想知道,是否有简单的方法来检查给定的路径是否可以传输到任何控制器中存在的(API)端点 我有一个具有最高优先级的自定义筛选器,如果给定的请求不会产生任何结果(端点不存在),我想返回404状态代码。看看这个类,特别是它的方法 从文档中: publicmap getHandlerMethods() 返回包含所有映射和HandlerMethod的(只读)映射 对于RequestMappingHandlerMapping,T是RequestMappingInfo 发件人: 封装以下请求映

就像标题一样。我想知道,是否有简单的方法来检查给定的路径是否可以传输到任何控制器中存在的(API)端点

我有一个具有最高优先级的自定义筛选器,如果给定的请求不会产生任何结果(端点不存在),我想返回404状态代码。

看看这个类,特别是它的方法

从文档中:

publicmap getHandlerMethods()

返回包含所有映射和HandlerMethod的(只读)映射

对于
RequestMappingHandlerMapping
T
RequestMappingInfo

发件人:

封装以下请求映射条件:

  • 模式请求条件
  • 请求方法请求条件
  • 参数请求条件
  • 校长条件
  • 消费需求条件
  • 生产要求条件
  • RequestCondition(可选,自定义请求条件)
  • 和来自:

    封装有关由方法和bean组成的处理程序方法的信息。提供对方法参数、方法返回值和方法注释的方便访问


    如果要从过滤器bean执行此操作,可以将
    RequestMappingHandlerMapping
    bean自动连接到它:

    @Component
    public class MyFilterBean extends OncePerRequestFilter {
    
        @Autowired
        RequestMappingHandlerMapping mappings;
    
    }
    

    为此,您需要创建一个将RequestMappingHandlerMapping作为属性的过滤器。大概是这样的:

     public class AllHandlersList extends OncePerRequestFilter {
    
        RequestMappingHandlerMapping requestMappingHandlerMapping;
    
        public AllHandlersList(RequestMappingHandlerMapping requestMappingHandlerMapping) {
            this.requestMappingHandlerMapping = requestMappingHandlerMapping;
        }
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            try {
                //Add you own logic here ot handle the request your way. 
                System.out.println(requestMappingHandlerMapping.getHandler(request).getHandler());
            } catch (Exception e) {
                e.printStackTrace();
            }
            filterChain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    然后你需要注册它。我看到您使用了spring boot,因此可以将其添加到java配置中:

        @Bean
        @Autowired
        public FilterRegistrationBean listHandlers(RequestMappingHandlerMapping requestMappingHandlerMapping) {
            FilterRegistrationBean register = new FilterRegistrationBean();
            register.setFilter(new AllHandlersList(requestMappingHandlerMapping));
            register.setName("handlerListFilter");
            register.setUrlPatterns(Arrays.asList(new String[]{"/"}));
            register.setOrder(Ordered.HIGHEST_PRECEDENCE);
            return register;
        }
    
    参考资料: API文档

    春季发行说明

    您是在为服务创建客户端,还是在托管服务并希望在处理请求之前检查自己的端点?@KevinBayes第二个问题。我正在添加一个筛选器,我想在其中检查端点是否存在(如果不存在,则发送404,发送其他状态代码,否则继续沿着筛选器链)。好的,我添加了一个示例,说明如何使用spring boot执行此操作。我可以问你如何从filter/OncePerRequestFilter类获取这些吗?@TrynkiewiczMariusz当然,只需自动连线
    RequestMappingHandlerMapping
    。我将编辑我的答案。