Spring MVC 中的@RequestParam 处理可选参数

新手上路,请多包涵

Spring 控制器是否可以同时处理这两种请求?

  1. http://localhost:8080/submit/id/ID123432?logout=true

  2. http://localhost:8080/submit/id/ID123432?name=sam&password=543432

如果我定义一个这样的控制器:

  @RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout", required = false) String logout,
                              @RequestParam("name") String username,
                              @RequestParam("password") String password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}

不接受带有“注销”的 HTTP 请求。

如果我定义两个控制器来分别处理每个请求,Spring 会抱怨异常“已经有’Controller’ bean 方法……映射”。

原文由 luksmir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 812
2 个回答

在 Java 8 和 Spring 5 之前(但也适用于 Java 8+ 和 Spring 5+)

您还需要为 required = false namepassword 提供请求参数。这是因为,当您仅提供 logout 参数时,它实际上期望 namepassword 因为它们仍然是“隐含的”。

It worked when you just gave name and password because logout wasn’t a mandatory parameter thanks to required = false already given for logout

Java 8 和 Spring 5(及更高版本)的更新

从 Java 8 开始,您现在可以使用 Optional 类来使参数成为可选的。

 @RequestMapping (value = "/path", method = RequestMethod.GET)
public String handleRequest(@RequestParam("paramName") Optional<String> variableName) {
    String paramValue = variableName.orElse("");
    // use the paramValue
}

原文由 Rahul 发布,翻译遵循 CC BY-SA 4.0 许可协议

作为 Spring 4.1.1 的一部分,您现在可以完全支持 Java 8 Optional原始票证)因此在您的示例中,只要您替换,两个请求都将通过您的单个映射端点 required=false 可选的 3 个参数注销、名称、密码:

 @RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,
 produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
                              @RequestParam(value = "logout") Optional<String> logout,
                              @RequestParam("name") Optional<String> username,
                              @RequestParam("password") Optional<String> password,
                              @ModelAttribute("submitModel") SubmitModel model,
                              BindingResult errors) throws LoginException {...}

原文由 dimitrisli 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题