两个请求具有相同的映射

时间:2018-05-16 14:25:09

标签: java spring-mvc

我需要按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}'!

4 个答案:

答案 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);
}