我有一个方法如下,{code}应该只接受A,B或C.
我知道解决问题的一种方法是定义三种方法(每种情况一种),但这并不是一种有效的方法。另一种方法是使用一个封闭开关盒的方法,但有没有更好的方法呢?
doSomeStuff()
答案 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。
但是说过我认为你的方法没有任何问题。