是否可以为@PathVariable的值定义范围?

时间:2015-09-25 00:47:54

标签: java spring spring-mvc

我有一个方法如下,{code}应该只接受A,B或C.

我知道解决问题的一种方法是定义三种方法(每种情况一种),但这并不是一种有效的方法。另一种方法是使用一个封闭开关盒的方法,但有没有更好的方法呢?

doSomeStuff()

4 个答案:

答案 0 :(得分:2)

没有更有效的方法,因为您无论如何都需要进行此检查。但是,您可以简化生活,例如通过创建具有已批准值的enum,例如:

public enum Numbers {
    ONE("Uno "),
    TWO("Dos "),
    THREE("Tres ");
}

你可以这样遍历:

for (Numbers dir : Numbers.values()) {
  // do what you want
}

你可以实现一个方法,比如这个

public String showSelectionOptions(@PathVariable String code){
    return Arrays.asList(Numbers.values()).contains(code) ? "selection" : "error";
}

这不是更有效,但它是一个更短的代码,如果您有许多值可以使用,它会有所帮助。

答案 1 :(得分:2)

您可以在Spring MVC中找到更直接的解决方案。尝试

@RequestMapping(value = "{code:A|B|C}/selection", method = RequestMethod.GET)
public String showSelectionOptions(@PathVariable String code){
   return "selection";
}

答案 2 :(得分:2)

所有答案都很好。但是他们错过了一条重要的信息:

您还可以在请求映射中使用其他对象类型而不是String。

在你的情况下,带有A,B和C的枚举就可以完成这项工作。

@RequestMapping(value="{code}/...")
public String do(@PathVariable("code") MyEnum code) {...}
  • 类型安全
  • 自动映射
  • 仅限于可能的枚举值
  • 无手动测试

答案 3 :(得分:0)

我认为你的方法看起来不错。我唯一的建议是,如果您不想将{code}作为URL参数传递,而是作为请求正文的一部分,那么您可以使用@RequestBody代替@PathVariable并将请求正文映射到DTO类。您可以使用@validated来验证至少提供的一个值{code} ir。

但是说过我认为你的方法没有任何问题。