在我的UserController中,我有 3@GetMapping種方法:
getAllUsers()- 用于獲取所有用戶,
getUserById()- 用于獲取具有唯一 ID 的特定用戶,
getUserByName()- 用于獲取具有唯一名稱的特定用戶。
該方法的代碼如下:
@RestController
@RequestMapping("/users")
public class UserController {
private final UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@GetMapping
public List<User> getAllUsers() {
return userRepository.findAll();
}
@GetMapping(value = "/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userRepository.findById(id);
return ResponseEntity.ok(user);
}
@GetMapping(value = "/{name}")
public ResponseEntity<User> getUserByName(@PathVariable String name) {
User user = userRepository.findUserByName(name);
return ResponseEntity.ok(user);
}
第一個問題是我的應用程式不知道 URL 是字串還是整數,所以我解決了getUserById()和getUserByName()方法之間的問題,如下所示:
@GetMapping(value = "{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userRepository.findById(id);
return ResponseEntity.ok(user);
}
@GetMapping
public ResponseEntity<User> getUserByName(@RequestParam(value = "name") String name) {
User user = userRepository.findUserByName(name);
return ResponseEntity.ok(user);
}
所以現在我可以使用以下方法訪問這些方法:
http://localhost:8080/users/1和
http://localhost:8080/users?name=john
當我運行應用程式時,我收到此錯誤:
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'userController' method
com.db.userapp.controller.UserController#getUserByName(String)
to {GET [/users]}: There is already 'userController' bean method
我相信這是因為我getAllUsers()和getUserByName()方法的 URL 格式相同。有誰知道我該如何解決這個問題?
uj5u.com熱心網友回復:
你是對的,因為兩者getAllUsers()都getUserByName()映射到/users/. 所以對于請求/users/,它不知道應該使用哪種方法來處理它。
您可以將 name 查詢引數配置/users/為可選,并檢查其值是否為空。Null 表示用戶不希望對用戶進行任何過濾并希望獲得所有用戶:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping
public List<User> getUser(@RequestParam(value = "name",required = false) String name) {
if (Strings.isNullOrEmpty(name)) {
return userRepository.findAll();
} else {
return userRepository.findUserByName(name);
}
}
}
uj5u.com熱心網友回復:
你是對的。您已經定義了兩個 GET 方法/users,因此它與您的第一個問題基本相同。
您可以合并這些方法并將名稱的 RequestParam 設定為不需要,并在它不為空時使用它。這里的問題是,即使您知道該名稱只有一個用戶,您也會將一個用戶作為串列回傳。我認為這很好,因為它不是用戶的主要識別符號,并且使用 RequestParam 它更像是一個過濾器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/498481.html
