Java 是否可以为@PathVariable的值定义一个范围?
我有一个如下的方法,{code}应该只接受a、B或C 我知道解决这个问题的一种方法是定义三种方法(每种情况一种),但这不是一种有效的方法。另一种方法是使用单个方法来封装一个开关盒,但是有更好的方法吗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){
@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) {...}
- 类型安全
- 自动绘图
- 限制为可能的枚举值
- 无需手动测试
{code:[A-Z]}
或类似于此的内容。不允许将do作为函数名:)