[java] 선택적 매개 변수를 처리하는 Spring MVC의 @RequestParam

스프링 컨트롤러가 두 종류의 요청을 모두 처리 할 수 ​​있습니까?

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 메소드가 있습니다.”라는 예외로 불평합니다.



답변

당신은 줄 필요가 required = false에 대한 namepassword요청 매개 변수뿐만 아니라. 그의 방금 제공 할 때, 때문에 logout매개 변수를 실제로 대한 기대 namepassword뿐만 아니라 그들은 여전히 필수입니다.

당신은 그냥 준 때 일을 name하고 password있기 때문에이 logout할 수있는 필수 매개 변수 덕분이 아니었다 required = false이미 주어진 logout.


답변

의 일환으로 Spring 4.1.1이후 지금 자바 (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 {...}


답변

사례를 처리하는 두 가지 방법을 만듭니다. @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 {...}


답변