2014-03-13 8 views
85

스프링 컨트롤러가 두 가지 요청을 모두 처리 할 수 ​​있습니까? 나는 종류의 단일 컨트롤러 정의하면Spring의 @RequestParam 선택적 매개 변수를 처리하는 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 요청은 "로그 아웃"을 인정하지 않습니다.

각 요청을 개별적으로 처리 할 두 개의 컨트롤러를 정의하면 "이미 '컨트롤러'bean 메서드 ... 맵핑이 있습니다"라는 예외로 Spring이 불평합니다.

답변

107

namepassword 요청 매개 변수에도 required = false을 제공해야합니다. logout 매개 변수 만 입력하면 실제로는 namepassword이 필요하며, 여전히 필수이기 때문입니다. logout 이미 logout 주어 required = false에 필수 매개 변수 감사하지 않았기 때문에 그냥 namepassword을 주었을 때

그것은했다.

30

사례를 처리하는 두 가지 방법을 만듭니다. @RequestMapping 주석에 요청을 매핑하는 동안 특정 매개 변수를 고려하도록 지시 할 수 있습니다. 그렇게하면 두 가지 방법으로 잘 분리 할 수 ​​있습니다. Spring 4.1.1의 일환으로

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

누군가 로그 아웃하고 이름과 암호를 모두 URL로 전달하면 어떻게됩니까? 그냥 설명서를 읽으십시오. '! myParam 스타일 표현은 \t * 지정된 매개 변수가 요청에 존재하지 않아야 함을 나타냅니다.'시도해야합니다. –

+1

가장 적합한 일치 항목을 찾을 것이고, 아마도 'handleLogin'을 사용하려고 시도 할 것입니다. 그렇지 않으면 매핑을 찾을 수 없다는 예외를 줄 것입니다. –

+0

보안 관점에서 볼 때 로그 아웃은 POST 요청 만 받아 들여야하므로 2 개의 메소드가 있어야하며 URL을 동일하게 유지하는 것은 의미가 없습니다. –

54

은 이후 지금 그러므로 귀하의 예를 모두 요청이 당신이 당신의 3 PARAMS 로그 아웃에 대한 옵션과 required=false를 대체 할만큼 당신의 단일 매핑 엔드 포인트를 통해 이동합니다 자바 (8)의 전폭적 인 지원 Optional (original ticket)가 , 이름 : 비밀번호 :

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

위대한. 감사. https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html – OhadR

+0

안녕하세요, @dimitrisli. '@PathVariable ("idOfUser") 옵션 idOfUser'를 사용하고 있습니다. 이제 ** idOfuser ** 값을 가져 오거나 인쇄해야합니다. 이 인쇄물을 인쇄 한 후 선택 사항 [1234] **을 받고 있기 때문에 친절하게 도와 줄 수 있습니까? 실제로 원하는 것은 ** 1234 **입니다. – Learner

+0

안녕하세요, @dimitrisli. 혼자서 그것을 알아 냈어. 어쨌든 고마워. :) – Learner

관련 문제