【问题标题】:Spring @RequestMapping headers OR instead of AND?Spring @RequestMapping 标头 OR 而不是 AND?
【发布时间】:2023-03-23 00:40:02
【问题描述】:

我的项目包含多种类型的网站,例如博客、论坛和网站。

我有博客、论坛和网站(以及更多)的特定控制器

我希望在网站类型之间共享某些控制器,例如登录控制器。

但我只希望登录控制器与论坛和站点共享。

我使用过滤器添加请求标头“partType”,它具有价值站点、论坛或博客。

我的登录控制器的@RequestMapping 是:

@RequestMapping(value="/dash/login",  headers={"partType=forum","partType=site" })

这会导致映射:

{[/dash/login/dologin],methods=[GET || POST],headers=[partType=forum && partType=site]}

注意 &&(和)。是否有可能获得 || (或)在这里?

因为“partType”标头从来都不是论坛和站点,但我确实希望登录控制器支持 partType 论坛和站点,但不支持博客,所以我不能只从 requestmapping 注释中删除标头属性。

【问题讨论】:

  • 如果没有默认设置,您必须为此编写自己的规则并重写 RequestMappingHandlerMapping 的一部分以便它们进行配置。
  • 干杯@M。 Deinum ,确实我已经在查看 RequestMappingHandlerMapping 但是覆盖这个的问题是 mvc:annotation-driven 在这样做时被禁用,从而使 spring 查找控制器和方法的所有好处变得无用。使用 java config 时有一个技巧,但我仍然坚持使用 xml config。
  • 附带说明:我找到了一个次优的解决方案,使用拦截器 preHandle() 将“partType”附加到 uri 并使用 RequestDispatcher 转发带有新 uri 的请求。这可行,但我担心性能下降,因为现在每个请求都由 RequestDispatcher 转发。
  • 无论您使用基于 XML 还是 Java 的配置,解决方案都是一样的。检测控制器是通过组件扫描完成的,实际处理它们的是RequestMappingHandlerAdapter,所以没有问题(除了从命名空间/注释中丢失默认配置和检测到的东西)。
  • 最简单的解决方案是为每个标头创建 2 个处理程序映射方法,并让它们在控制器上调用相同的(内部)方法。

标签: spring spring-mvc


【解决方案1】:

尝试使用 headers=["partType=forum,site"],它可能会起作用。 它在您设置 content-type=application/json,application/xml

时起作用

【讨论】:

  • 感谢您的回复,我只是试了一下,但它不起作用。使用“partType=forum,site”时,标题需要是“partType=forum,site”。 , (逗号)被忽略,它不作为 OR 线程。我怀疑“内容类型”做了一些神奇的事情。
【解决方案2】:

这确实是一次通过 spring mvc 内部工作的旅程。当我浏览RequestMappingHandlerMapping 的源代码时,注意到createRequestMappingInfo 在Controller 上寻找RequestCondition

进一步研究RequestCondition 的东西,我注意到默认的RequestMappingHandlerMapping 对它没有任何作用。在网上搜索为什么它忽略RequestCondition时,我发现了这篇文章: How to implement @RequestMapping custom properties

第一个答案给出了RequestCondition 和扩展RequestMappingHandlerMapping 的示例。但是扩展RequestMappingHandlerMapping 意味着没有<mvc:annotation-driven />

我搞砸了BeanPostProcessor,并得到了使用自定义RequestMappingHandlerMapping 的功能,但是不可能围绕RequestMappingHandlerMapping 的现有实例编写包装器。

幸运的是,我浏览了上面的网址并阅读了链接到帖子的 cmets: Howto get rid of <mvc:annotation-driven />? 这个解释了如何用自定义 xml 替换 &lt;mvc:annotation-driven /&gt;,它做同样的事情,但允许设置 RequestMappingHandlerMapping

经过一番摆弄后,它现在可以工作了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多