我的项目由多种类型的网站组成,例如博客、论坛和网站。
我有博客、论坛和网站(以及更多)的特定 Controller
我希望在不同类型的站点之间共享某些 Controller ,例如登录 Controller 。
但我只想与论坛和网站共享登录 Controller 。
我使用过滤器添加请求 header “partType”,其中包含值网站、论坛或博客。
我的登录 Controller 的 @RequestMapping 是:
@RequestMapping(value="/dash/login", headers={"partType=forum","partType=site" })
这会导致映射:
{[/dash/login/dologin],methods=[GET || POST],headers=[partType=forum && partType=site]}
注意&&(和)。是否有可能获得 || (或)在这里?
因为“partType” header 从来都不是论坛和网站,但我确实希望登录 Controller 支持partType论坛和网站,但不支持博客,所以我不能只从请求映射注释中删除 header 属性。
最佳答案
这确实是一次了解 Spring MVC 内部运作的旅程。当我浏览RequestMappingHandlerMapping
的源代码时注意到createRequestMappingInfo
寻找RequestCondition
在 Controller 上。
进一步研究RequestCondition
我注意到默认的 RequestMappingHandlerMapping
对此不做任何事情。在网上搜索为什么它忽略 RequestCondition
我找到了这个帖子:
How to implement @RequestMapping custom properties
第一个答案给出了 RequestCondition
的示例并延伸RequestMappingHandlerMapping
。但延伸RequestMappingHandlerMapping
意味着没有<mvc:annotation-driven />
.
我搞乱了 BeanPostProcessor
并得到了与自定义一起使用 RequestMappingHandlerMapping
,但是围绕 RequestMappingHandlerMapping
的现有实例编写包装器不可能。
幸运的是,我回到了上面的网址并阅读了链接到帖子的评论:
Howto get rid of <mvc:annotation-driven />?
这个解释了如何替换 <mvc:annotation-driven />
使用自定义 xml 执行相同的操作,但允许设置 RequestMappingHandlerMapping
.
经过一番摆弄后,它现在可以工作了!
关于Spring @RequestMapping headers OR 而不是 AND?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48326631/