Spring @RequestMapping除/ api /或/ rest /外的所有内容(正则表达式中的否定词)

问题描述 投票:0回答:1

我需要一个Spring @RequestMapping,我将使用它来匹配所有非/api/...路径,例如/products,以将它们转发到我的/(由return "forward:/";传递)视图控制器,该控制器实际提供index.html内容和导致服务前端(反应)应用程序,以便前端应用程序可以处理此路径以呈现页面。

[请注意,此@RequestMapping隐式地与/不匹配,因为它将以无限递归和StackOverflowError结束。也可能值得排除index.html

换句话说,我希望我的/api/products由Spring Boot应用程序“本地”处理,其中/products/应该转发给渲染React应用程序。没有Apache或Nginx代理-借助静态资源映射,Spring可以提供React应用。

我已经研究了这个领域中许多类似的Stackoverflow问题,但没有一个起作用。

重要说明:我在Stackoverflow上看到的情况只能解决问题,只是因为最初看起来像是可以正常工作(/products/已转发,/api/products由API Controller处理),但实际上并非如此。 t,因为建议的正则表达式与everything匹配,并且/api/products仅由Spring映射优先级处理(更具体的“获胜”),但是如果不存在其他Controller,则相同的路径实际上将与模式匹配。

这会导致不适当的404(或未找到映射)错误处理-调用任何甚至是不存在的/api/something终结点都会在我找到的所有答案中都转发到index.html,我想避免这种情况。 访问不存在的/api/something终结点应该以没有找到处理程序而出现Spring错误,而不是前进。这种解决方案的一个示例是最受欢迎的解决方案,例如:@RequestMapping(value = "{_:^(?!api).*$}")

问题是,无论我尝试哪种模式,最终都将转发所有测试用例(例如/api/api//api/x/page//page/2或无。)>

仅是我尝试过的一些模式示例:

@RequestMapping(value = "{_:^(?!index\\.html|api).*$}")
@RequestMapping(value = "{x:^(?!api).*$}") 
@RequestMapping(value = "/{path:^(?!api/).*$}")
@RequestMapping(value = "/{dataType:^.*(?!api).*$}")
@RequestMapping(value = "/{arg:(?!sitemap.xml|api|index.html).*$}")
@RequestMapping(value = "{arg:^(?!api|!index.html).*$}/**")
@RequestMapping(value = "{_:^(?!index\\.html|api).*$}")

我需要一个Spring @RequestMapping,它将用于匹配所有非-/ api / ...路径,例如/ products,以将它们转发到我的/(通过返回“ forward:/”;)视图控制器,该控制器实际上是为索引服务的。 html ...

regex spring spring-mvc regex-negation request-mapping
1个回答
0
投票

问题仍然有效,但是对于需要解决方案的人,我可以建议在过滤器级别转发:

© www.soinside.com 2019 - 2024. All rights reserved.