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

Java 是否可以为@PathVariable的值定义一个范围?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我有一个如下的方法,{code}应该只接受a、B或C 我知道解决这个问题的一种方法是定义三种方法(每种情况一种),但这不是一种有效的方法。另一种方法是使用单个方法来封装一个开关盒,但是有更好的方法吗 @RequestMapping(value = "{code}/selection", method = RequestMethod.GET) public String showSelectionOptions(@PathVariable String code){ switch(code){

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

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

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

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


不过,尽管如此,我认为你的方法没有任何问题

没有比这更有效的方法了,因为您无论如何都需要进行此检查。但是,您可以简化您的生活,例如,使用批准的值创建一个
enum
,如下所示:

public enum Numbers {
    ONE("Uno "),
    TWO("Dos "),
    THREE("Tres ");
}
for (Numbers dir : Numbers.values()) {
  // do what you want
}
您可以像这样遍历它:

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";
}

这并不是更有效,但如果您有许多值要处理,它是一个较短的代码。

您在Spring MVC中有一个更直接的解决方案来满足您的需要。试一试

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

所有的答案都很好。但他们缺少一条重要信息:

您还可以在requestmappings中使用其他对象类型而不是字符串

在您的例子中,带有A、B和C的枚举正好可以完成这项工作

@RequestMapping(value="{code}/...")
public String do(@PathVariable("code") MyEnum code) {...}
  • 类型安全
  • 自动绘图
  • 限制为可能的枚举值
  • 无需手动测试

谢谢,如果我需要将其作为一个范围,比如a到zt,那么如何?上面提到的只是一个正则表达式,因此如果您编写一个适合您需要的正则表达式,您就有了解决方案。我认为在您的情况下,它应该类似于
{code:[A-Z]}
或类似于此的内容。不允许将do作为函数名:)