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

18 浏览
0 Comments

在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 {...}

带有“logout”的HTTP请求将不被接受。

如果我定义两个控制器来分别处理每个请求,Spring将抱怨异常“已经存在\'Controller\'bean方法...映射”。

admin 更改状态以发布 2023年5月23日
0
0 Comments

作为Spring 4.1.1及以上版本的一部分,您现在完全支持Java 8的Optional原始票证)。因此在您的示例中,只要将required=false替换为Optional,您的三个参数“logout”、“name”、“password”都将通过单个映射端点进行传输:

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

0
0 Comments

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

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

当您仅提供name password时,它会起作用,因为required = false已经为logout给出,所以logout不是强制性参数。

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

您现在可以使用Java 8及以上版本的Optional类使参数变得可选。

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

0