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


186

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

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에 대한 namepassword요청 매개 변수뿐만 아니라. 그의 방금 제공 할 때, 때문에 logout매개 변수를 실제로 대한 기대 namepassword뿐만 아니라 그들은 여전히 필수입니다.

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


168

의 일환으로 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 {...}

2
@VibhavChaddha 다음과 같은 것을 사용할 수 있습니다 : if (idOfUser.isPresent ()) {System.out.println ( "idOfUser :"+ idOfUser.get ()); }
Cassio Seffrin

10
Intellij 경고 : 'requestedTimelineStart'매개 변수의 유형으로 사용 된 'Optional <Long>'less ... (Strg + F1) 검사 정보 : java.util.Optional <T>, java.util.OptionalDouble, java의 사용을보고합니다. 필드 또는 매개 변수의 유형으로 util.OptionalInt, java.util.OptionalLong 또는 com.google.common.base.Optional. 선택적은 "결과 없음"을 나타내는 명확한 방법이 필요한 라이브러리 메소드 리턴 유형에 대해 제한된 메커니즘을 제공하도록 설계되었습니다. 클래스가 직렬화 가능해야하는 경우 java.util.Optional 유형의 필드를 사용하는 것도 문제가됩니다.
PeMa

이것은 내가 믿는 Java 8의 새로운 정답이어야합니다.
java-addict301

40

사례를 처리하는 두 가지 방법을 만듭니다. @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에 모두 전달하면 어떻게됩니까? 문서를 읽으면 !myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.시도 해야한다고 합니다.
ring bearer

2
가장 일치하는 것을 찾을 수 있습니다. 아마도 handleLogin다른 것을 사용하려고 시도하면 매핑을 찾을 수 없다는 예외가 발생합니다.
M. Deinum

3
한 가지 참고 사항 : 보안 관점에서 로그 아웃은 POST 요청 만 수락 해야 하므로 두 가지 방법 이 있어야 하며 URL을 동일하게 유지하는 것은 의미가 없습니다.
RusH 출처 : Ru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.