如何配置Java Spring GET请求匹配除/api和/swagger-ui外的所有路由
解决Spring匹配除/api外所有路由的问题
你的问题根源在于当前控制器的@GetMapping("/**/{path:[^\\.]*}")会匹配所有GET请求,包括/api/开头的接口,导致这些GET请求被转发到React页面;而POST请求不受影响是因为该控制器只处理GET方法。
下面是几种可行的解决方案:
方案一:修改控制器映射路径,排除/api开头请求
利用Spring支持的否定路径模式,直接在映射规则中排除/api路径:
@Controller public class ClientForwardController { // 匹配所有非/api开头、且路径不含后缀的GET请求 @GetMapping(value = {"/**/{path:[^\\.]*}", "!/api/**"}) public String forward() { return "forward:/"; } }
方案二:通过WebMvcConfigurer配置全局转发规则(推荐)
这种方式更清晰,统一管理前端路由转发逻辑,同时自动排除/api接口:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { // 配置转发规则:非/api开头、非静态资源的路径都转发到index.html registry.addViewController("/**") .setViewName("forward:/index.html") .setCustomCondition(new RequestCondition() { @Override public RequestCondition combine(RequestCondition other) { return this; } @Override public RequestCondition getMatchingCondition(HttpServletRequest request) { String requestUri = request.getRequestURI(); // 排除/api开头的接口和带后缀的静态资源(如.js、.css、.png等) if (requestUri.startsWith("/api/") || requestUri.contains(".")) { return null; } return this; } @Override public int compareTo(RequestCondition other, HttpServletRequest request) { return 0; } }); } }
方案三:控制器内手动判断请求路径
如果不想修改映射规则,也可以在方法内判断请求URI,跳过/api开头的请求:
@Controller public class ClientForwardController { @GetMapping(value = "/**/{path:[^\\.]*}") public String forward(HttpServletRequest request) { String requestUri = request.getRequestURI(); // 若为/api开头请求,返回null让Spring寻找对应API控制器处理 if (requestUri.startsWith("/api/")) { return null; } return "forward:/"; } }
注意事项
- 确保你的API控制器已经正确配置了
@RequestMapping("/api")或对应子路径,Spring会优先匹配API控制器的请求,再执行前端路由转发。 - React打包后的静态资源(如.js、.css)需确保Spring能正确访问,可通过配置
spring.web.resources.static-locations指定静态资源目录。
内容的提问来源于stack exchange,提问作者Ho Quang Lam
相关产品推荐
相关产品推荐

