【问题标题】:Spring MVC Request mapping, can this be dynamic/configurable?Spring MVC 请求映射,这可以是动态/可配置的吗?
【发布时间】:2012-10-03 14:09:00
【问题描述】:

使用 Spring MVC,我知道您如何在每个控制器和方法/动作中设置 RequestMapping

但是如果我希望它是可配置的,例如我下面的控制器:

BlogController 
 - with methods for listing blogs entries, single entry, new, update, etc.
ArticleController
 - with methods for listing articles entries, single entry, new, update, etc.

现在在我的应用程序中,管理员可以为网站设置 2 个博客和 1 个文章部分,因此网址如下:

www.example.com/article_section1/ - uses ArticleController
www.example.com/blog1/ - uses BlogController
www.example.com/blog2/ - uses BlogController

也许一段时间后管理员想要另一个文章部分,所以他们只需配置一个新部分,例如:

www.example.com/article_section2/

这必须动态/即时工作,当然无需重新启动应用程序。

我的问题只涉及如何处理到控制器的 url 映射。

如何使用 Spring MVC 实现这一点?

我只知道如何在控制器或方法级别使用 @RequestMapping("/helloWorld") 将 url 映射到控制器,但这使得 url 映射是固定的,不能像我想要的那样进行配置。

更新:

我会将路径存储在数据库中,并映射到控制器类型,如下所示:

path                  controller
/article_section1/    article
/blog1/               blog
/blog2/               blog
..

有了以上信息,我如何将请求分派给正确的控制器?

同样,不打算重新加载/重新部署,我意识到这需要更多的工作,但它在规范中:)

【问题讨论】:

  • 你最终是如何实现这个的?我也有类似的情况。

标签: java spring spring-mvc


【解决方案1】:

这种 URL 映射对您有用吗?

www.example.com/blog/1/
www.example.com/blog/2/

如果是,那很简单:Spring 3 支持路径变量:http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-requestmapping-advanced

或者,您可以创建一个通用请求映射和您自己的读取配置文件的子调度程序,但我认为这可能比它的价值更多。

【讨论】:

  • 我想完全控制 url,我知道路径变量,谢谢。实际上我打算从数据库中读取路径,然后以某种方式将请求转发到正确的控制器,但不确定如何。
【解决方案2】:

在运行时真正更改请求映射可能很困难(并不真正推荐,因为很容易发生小错误)。如果您仍然希望这样做,也许 JRebel,更具体地说是 LiveRebel,对于实时重新部署代码和配置会很有趣。

否则,与其他帖子建议的一样,RequestMappings 支持通配符,快速阅读官方文档后应该清楚其限制。

【讨论】:

  • 不,我想完全控制 url,所以这不起作用,我不想重新加载/重新部署任何代码。希望我能以某种方式将请求转发给正确的控制器。
  • 编写自己的 HandlerMapping 可能会很有趣static.springsource.org/spring/docs/3.0.x/javadoc-api/org/…
  • 感谢您提供的链接,这似乎是我在满足要求时必须采取的方向。
  • 提取注解@RequestMapping的handlermapping叫什么名字,会不会很简单?
  • JRebel 支持 Spring 注释,因此如果您更改 @RequestMapping 值,映射将即时重新配置。以及添加新的 bean、组件、服务等
【解决方案3】:

尝试使用@RequestMapping 通配符,如下所示:

@RequestMapping(value="/article_section*/"}
public void getArticle(....){
//TODO implementation
}

@RequestMapping(value="/blog*/"}
public void getBlog(....){
//TODO implementation
}

希望对你有帮助!!!

【讨论】:

    【解决方案4】:

    另一种解决方案可能是创建一个自定义注释,其中包含@RequestMapping 上已定义的路径以及要应用的新路径,比如@ApiRestController

    然后,在 Spring 上下文加载之前,@Controller 类可以更改为在运行时由新的(使用所需路径)更改其注释值。通过这样做,Spring 将加载增强的请求映射,而不是默认的。

    创建了一个小项目来为将来需要此功能的人举例说明https://gitlab.com/jdiasamaro/spring-api-rest-controllers

    希望对您有所帮助。 干杯。

    【讨论】:

    • 我还没有尝试过,但是查看了代码,这实际上可能为我解决了一个相当独特的问题。谢谢!
    【解决方案5】:

    这不行吗? @RequestMapping("/helloWorld*")

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 2012-09-27
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多