@RequestParam in Spring MVC handling optional parameters

后端 未结 3 1893
你的背包
你的背包 2020-12-07 09:08

Is it possible for a Spring controller to handle both kind of requests?

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

2) http:/

相关标签:
3条回答
  • 2020-12-07 09:17

    As part of Spring 4.1.1 onwards you now have full support of Java 8 Optional (original ticket) therefore in your example both requests will go via your single mapping endpoint as long as you replace required=false with Optional for your 3 params 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<String> logout,
                                  @RequestParam("name") Optional<String> username,
                                  @RequestParam("password") Optional<String> password,
                                  @ModelAttribute("submitModel") SubmitModel model,
                                  BindingResult errors) throws LoginException {...}
    
    0 讨论(0)
  • 2020-12-07 09:22

    You need to give required = false for name and password request parameters as well. That's because, when you provide just the logout parameter, it actually expects for name and password as well as they are still mandatory.

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

    0 讨论(0)
  • 2020-12-07 09:30

    Create 2 methods which handle the cases. You can instruct the @RequestMapping annotation to take into account certain parameters whilst mapping the request. That way you can nicely split this into 2 methods.

    @RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                     produces="text/xml", params={"logout"})
    public String handleLogout(@PathVariable("id") String id, 
            @RequestParam("logout") String logout) { ... }
    
    @RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
                     produces="text/xml", params={"name", "password"})
    public String handleLogin(@PathVariable("id") String id, @RequestParam("name") 
            String username, @RequestParam("password") String password, 
            @ModelAttribute("submitModel") SubmitModel model, BindingResult errors) 
            throws LoginException {...}
    
    0 讨论(0)
提交回复
热议问题