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