如何在RequestMapping中使用SPEL和正则表达式

时间:2015-04-03 06:35:53

标签: regex spring-mvc spring-el

我有一个控制器方法如下

@RequestMapping(value = "/{fruitName:Mango|Orange|Grapes}", method = RequestMethod.GET)
public String viewFruit(ModelMap model, @PathVariable String fruitName) {
  ...
}

我在这里硬编码 Mango,Orange和Grapes ,这样如果url与其中任何一个匹配,那么只有这个方法才能执行。

我想做的是,而不是在这里对这些成果进行硬编码。我想在属性文件中声明它们并使用SPEL,我应该把它带到这里。

这可能吗?

我为此尝试了以下代码,但因错误而失败:

@RequestMapping(value = "/{fruitName:#{fruit['seasonFruit.requestMapping']}}", method = RequestMethod.GET)
public String viewFruit(ModelMap model, @PathVariable String fruitName) {   
    ...
}

对于以下属性文件( fruit.properties

seasonFruit.requestMapping = Mango|Orange|Grapes

请建议,如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

  

@ArtemBilan那么,我们有什么方法可以实现这一目标吗?通过分离硬编码

好吧,我希望你能从代码中做到这一点:

@Value("#{ environment['seasonFruit.requestMapping'] }")
private String fruitName;

@RequestMapping(value = "/{fruitName:[a-z]", method = RequestMethod.GET)
public String viewFruit(ModelMap model, @PathVariable String fruitName) {   
   if (fruitName.matches(this.fruitName))
}

答案 1 :(得分:1)

您可能无法直接在requestMapping中使用REGEX和从属性文件加载的值的组合。但我能够在一个示例应用程序中实现。本质上我是从属性文件中解析整个正则表达式模式,而不仅仅是它的值。 RequestMapping可以解析属性文件中的值。希望这有帮助。

属性文件

sample.test={url:mango|orange}

控制器方法:

@RequestMapping(value = { "/example/${sample.test}" }, method = RequestMethod.GET)
    public String testPattern(@PathVariable String url) {
        System.out.println("url:" + url);
        return sample;    
    }