@RequestParam в Spring MVC обработка необязательных параметров
возможно ли, чтобы пружинный контроллер обрабатывал оба вида запросов?
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 ... отображенный."
3 ответов
вам нужно дать required = false
на name
и password
параметры запроса, а также. Потому что, когда вы предоставляете только logout
параметр, он фактически ожидает для name
и password
а также они по-прежнему являются обязательными.
это сработало, когда вы просто дали name
и password
, потому что logout
не был обязательным параметром благодаря required = false
уже дал для logout
.
в рамках Spring 4.1.1
далее теперь у вас есть полная поддержка Java 8 Optional
(оригинал билета) поэтому в вашем примере оба запроса будут проходить через вашу единую конечную точку сопоставления, пока вы заменяете required=false
С опционным для вашего выхода 3 params, имени, пароля:
@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 {...}
создайте 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 {...}