@RequestParam навесні MVC обробляє необов'язкові параметри


186

Чи можливо контролер 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 ... відображений".


2
Читайте цю статтю: codeflex.co/…
ybonda

Відповіді:


224

Ви повинні надати required = falseдля nameі passwordпараметри запиту , а також. Це тому, що, коли ви надаєте лише logoutпараметр, він насправді очікуєname і passwordтак само , як вони по - , як і раніше є обов'язковим.

Він працював, коли ви тільки що давали, nameі passwordтому що logoutне був обов'язковим параметром завдяки required = falseвже наданому logout.


168

Як частина 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 {...}

2
@VibhavChaddha можна використовувати щось подібне: якщо (idOfUser.isPresent ()) {System.out.println ("idOfUser:" + idOfUser.get ()); }
Кассіо Сеффрін

10
Попередження Intellij: "Необов’язково <Long>" використовується як тип для параметра "requestTimelineStart" менше ... (Strg + F1) Інформація про перевірку: повідомляє про будь-яке використання java.util.Otional <T>, java.util.OptionsDouble, java. util.OptionsInt, java.util.OtionalLong або com.google.common.base. Необов’язковий як тип для поля чи параметра. Необов'язково було розроблено, щоб забезпечити обмежений механізм повернення методів повернення бібліотечних методів, де потрібно було чітко представити "відсутність результату". Використання поля з типом java.util.Options також є проблематичним, якщо клас повинен бути Serializable, що java.util.O optional не є.
PeMa

Це я повинен бути новою правильною відповіддю з Java 8, я вважаю.
java-addict301

40

Створіть 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 {...}

1
що буде, коли хтось передасть і URL, і ім’я, і пароль до URL-адреси? Просто прочитайте документацію, там написано, що !myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.треба спробувати.
носій кільця

2
Він знайде найкращий збіг, він, ймовірно, спробує використати handleLoginінше, він дасть виняток, вказуючи, що відображення не знайдеться.
М. Дейнум

3
Лише одне зауваження: з точки зору безпеки вихід із системи безпеки повинен приймати лише запити POST, тому повинні бути два способи, і не має сенсу зберігати їх URL-адресу однаковою.
FlasH від Ru
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.