我需要按ID和用户名获取用户信息。我可以有2个这样的请求吗?
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userRepository.getOne(id);
}
@GetMapping("/user/{username}")
public User getUser(@PathVariable String username) {
return userRepository.findUserByUsername(username);
}
public interface UserRepository extends JpaRepository<User,Long>{
@Query("SELECT u FROM u WHERE username= :#{username}")
User findUserByUsername(@Param("username") String username);
}
错误:findUserByUsername(java.lang.String) but parameter 'Optional[username]' not found in annotated query 'SELECT u FROM u WHERE username= :#{username}'!
答案 0 :(得分:5)
如果我没记错的话你可以通过正则表达式来做到这一点:
@GetMapping("/user/{id:[\\d]+}")
@GetMapping("/user/{username:^[a-fA-F]{100}$}")
答案 1 :(得分:2)
不,你不能这样做,因为两个请求都可以映射到这两个方法。 更好的方法是,
@GetMapping("/user")
public User getUser(@RequestParam("username") String username, @RequestParam("userId") Long userId) {
// find by Criteria.
}
并称之为,
http://<host>:<port>/<context>/user?userId=123&username=abc
,查询参数是可选的,因此您可以省略任何不需要的内容。
答案 2 :(得分:0)
HTTP是基于文本的协议,因此path参数始终是字符串。
你应该用@RequestParam解决这个问题。
答案 3 :(得分:0)
您可以使用请求参数执行此操作:
@GetMapping(value = "/user", params = "id")
public User getUser(@RequestParam("id") Long id) {
return userRepository.getOne(id);
}
@GetMapping(value = "/user", params = "username")
public User getUser(@RequestParam("username") String username) {
return userRepository.findUserByUsername(username);
}