【问题标题】:Overriding RequestMapping on SpringMVC controller在 Spring MVC 控制器中覆盖 RequestMapping
【发布时间】:2013-06-15 22:21:40
【问题描述】:

查看我们应用程序的源代码,我发现了一个常见的 Spring MVC 控制器,它显示了多次复制和粘贴的配置的键和值。除了 RequestMapping 值之外,类定义完全相同,因为每个应用程序都希望此页面在不同的 URL 下可用。

我想将此控制器移动到一个公共库中,并提供一个默认的 RequestMapping 值。

@Controller 
@RequestMapping (value="/property")
public class CommonPropertyController {
   ....
}

如果每个应用程序想要使用自己的 url 模式,他们将如何覆盖此值?

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    查看源代码,我知道了如何做到这一点,而无需返回手动(预注释)处理程序定义(这也是实现所需内容的一种方式)。

    Spring 允许您在 @RequestMapping 值中使用属性占位符配置器。因此可以使用该事实并定义@RequestMapping,例如:

    @Controller
    @RequestMapping("${routing.property.path}")
    public class CommonPropertyController {
        ....
    }
    

    然后,您只需在应用程序上下文中使用正确的属性定义 PropertySourcesPlaceholderConfigurer,就可以开始了。


    更新如果您想在未指定属性的情况下进行后备映射,还可以使用属性占位符指定默认值:

    @RequestMapping("${routing.property.path:/property}")
    

    【讨论】:

    • 如果属性不存在,这具有禁用控制器的额外好处。正是我想要的。
    • 我不确定您能否通过这种方式禁用控制器。它将被映射到占位符本身,否则您可能会收到有关未解析属性的错误...顺便说一句。我还注意到 @RequestMapping JavaDoc 中提到了占位符行为 :)
    • 浏览文档还有更好的功能 - 您可以在属性占位符中指定默认值:@RequestMapping("${routing.property.path:/property}")。将其添加到答案中。
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 2014-01-02
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多