2016-04-09 16 views
0

, also erstelle ich eine Benutzer-API und versuche, getUserByEmail() vor dem Login aufzurufen. Mein Problem ist, dass ich eine Ambiguous-Handler-Methoden für den HTTP-Pfad ERROR zugeordnet.Spring GET same URL, aber verschiedene Parametertypen

@RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<User> getUser(@PathVariable("id") int id) { 
    System.out.println("Fetching User with id " + id); 
    User user = userService.findById(id); 
    if (user == null) { 
     System.out.println("User with id " + id + " not found"); 
     return new ResponseEntity<User>(HttpStatus.NOT_FOUND); 
    } 
    return new ResponseEntity<User>(user, HttpStatus.OK); 
} 

@RequestMapping(value = "/user/{email}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<User> getUserByEmail(@PathVariable("email") String email) { 
    System.out.println("Fetching User with email " + email); 
    User user = userService.findByEmail(email); 
    if (user == null) { 
     System.out.println("User with email " + email + " not found"); 
     return new ResponseEntity<User>(HttpStatus.NOT_FOUND); 
    } 
    return new ResponseEntity<User>(user, HttpStatus.OK); 
} 

Hier ist die Fehlerreaktion erhalte ich:

{ "Zeitstempel": 1460226184275, "status": 500, "Fehler": "Internal Server Error", "Ausnahme": "java.lang .IllegalStateException "," message ":" Für den HTTP-Pfad 'http://localhost:8080/user/fr' wurden mehrdeutige Handler-Methoden zugeordnet: {public org .springframework.http.ResponseEntity com.ffa.controllers.UserController.getUser (int), öffentliche org.springframework .http. ResponseEntity com.ffa.controllers.UserController.getUserByEmail (java.lang.String)} "," Pfad ":"/user /fr "}

Ich weiß, dass mein Problem etwas damit zu tun hat, dass ich ein GET habe, das dasselbe ist, aber unterschiedliche Parametertypen hat. Jede Hilfe würde sehr geschätzt werden!

+1

Kombinieren Sie Ihre Mapping-Methoden und haben Logik in der Ort, die Verwendung abhängig von Ihrer ID oder E-Mail-Adresse abrufen – LearningPhase

+1

Derzeit nach Ihrer Logik/Benutzer/weiß nicht, ob es eine E-Mail für ID ist. Entweder hast du/user/email? Email = und/user/id? Id = id – LearningPhase

+0

@LearningPhase Ich möchte, dass sie getrennt sind, da jeder etwas anderes macht. Wie ändere ich das, damit es weiß, welches zu verwenden ist? – alcol92

Antwort

0

Anstelle von PathVariables können Sie RequestParams mit zwei verschiedenen URLs verwenden.

@RequestMapping(value = "/user", params="userID", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<User> getUser(@RequestParam("userID") int id) { 
    System.out.println("Fetching User with id " + id); 
    User user = userService.findById(id); 
    if (user == null) { 
     System.out.println("User with id " + id + " not found"); 
     return new ResponseEntity<User>(HttpStatus.NOT_FOUND); 
    } 
    return new ResponseEntity<User>(user, HttpStatus.OK); 
} 

@RequestMapping(value = "/user", params="emailID, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE") 
public ResponseEntity<User> getUserByEmail(@RequestParam("emailID") String email) { 
    System.out.println("Fetching User with email " + email); 
    User user = userService.findByEmail(email); 
    if (user == null) { 
     System.out.println("User with email " + email + " not found"); 
     return new ResponseEntity<User>(HttpStatus.NOT_FOUND); 
    } 
    return new ResponseEntity<User>(user, HttpStatus.OK); 
} 

Wenn Sie /user?userID=123 nennen es die erste aufrufen und wenn Sie /[email protected] nennen es die zweite aufrufen. Dies wird durch die Eigenschaft params sichergestellt, die in der @RequestMapping übergeben wird.

Verwandte Themen