@RequestParam в Spring Обработка MVC дополнительных параметров

Возможно ли, чтобы контроллер 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 жалуется на исключение "Существует уже метод" Контроллер "bean... сопоставлен".

Ответ 1

Вам нужно указать required = false для параметров запроса name и password. Это потому, что, когда вы предоставляете только параметр logout, он действительно ожидает для name и password, а также они все еще являются обязательными.

Это сработало, когда вы просто указали name и password, потому что logout не был обязательным параметром благодаря required = false, уже указанному для logout.

Ответ 2

В рамках 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 {...}

Ответ 3

Создайте 2 метода, которые обрабатывают случаи. Вы можете проинструктировать аннотацию @RequestMapping, чтобы принять во внимание определенные параметры при отображении запроса. Таким образом, вы можете легко разделить это на 2 метода.

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