Spring RestController-findById和findByEmail请求方法不工作(处理程序不明确)
我想根据ID或电子邮件检索Spring RestController-findById和findByEmail请求方法不工作(处理程序不明确),spring,spring-mvc,spring-boot,spring-data-rest,Spring,Spring Mvc,Spring Boot,Spring Data Rest,我想根据ID或电子邮件检索用户的信息。下面是我编写的控制器类: @RestController @RequestMapping("/users") public class UserController { @Autowired private UserDao userDao; @GetMapping(value = "/{id:\\d+}") public User findOneById(@PathVariable("id") final Integer
用户的信息。下面是我编写的控制器类:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserDao userDao;
@GetMapping(value = "/{id:\\d+}")
public User findOneById(@PathVariable("id") final Integer userId) {
return userDao.findById(userId).get();
}
@GetMapping(value = "/{email}")
public User findOneByEmail(@PathVariable("email") final String email) {
return userDao.findByEmail(email).get();
}
代码不工作,出现错误
java.lang.IllegalStateException:为HTTP路径映射的不明确处理程序方法'http://localhost:8080/users/12223“:{public com.ofly.persistence.model.User com.ofly.rest.controller.UserController.findOneById(java.lang.Integer),public com.ofly.persistence.model.User com.ofly.rest.controller.UserController.findOneByEmail(java.lang.String)}
我原以为Regex可以解决这个问题,但不幸的是它没有解决。
我理解错误的原因,但如何处理此类要求?有不同的方法来解决此问题。可以提供两个具有不同路径的GetMapping,也可以只在一个get请求中使用查询参数。如果设置了电子邮件,则通过电子邮件检索数据;如果设置了其他电子邮件,则通过其他参数检索数据。使用此解决方案,您可以轻松添加更多要搜索的参数,并且可以通过或和查询数据,而无需添加新的控制器方法
网址:或
有不同的方法来解决这个问题。可以提供两个具有不同路径的GetMapping,也可以只在一个get请求中使用查询参数。如果设置了电子邮件,则通过电子邮件检索数据;如果设置了其他电子邮件,则通过其他参数检索数据。使用此解决方案,您可以轻松添加更多要搜索的参数,并且可以通过或和查询数据,而无需添加新的控制器方法
网址:或
您的问题是http://localhost:8080/users/12223
同时匹配/users/{id:\\d+}
和/users/{email}
。12223是两种方法的有效参数:
- 12223匹配
{id:\\d+}
,因为它包含所有数字
- 12223匹配
{email}
,因为未指定正则表达式,任何参数都将匹配email
Spring无法选择适当的端点,并给出错误:映射到HTTP路径的处理程序方法不明确
如果您尝试其他参数,请说:http://localhost:8080/users/somebody@com
,则不会出现错误。斯普林会发现的somebody@example.com与id
不匹配,与email
匹配
正如JB Nizet在评论中提到的,有两种方法可以解决此问题:
为电子邮件指定正则表达式以匹配电子邮件格式,类似于{email:.++.+\..+}
澄清端点,如建议的pDer666:
@GetMapping(value=“/email/{email}”)
@GetMapping(value=“/id/{id:\d+}”)
您的问题是http://localhost:8080/users/12223
同时匹配/users/{id:\\d+}
和/users/{email}
。12223是两种方法的有效参数:
- 12223匹配
{id:\\d+}
,因为它包含所有数字
- 12223匹配
{email}
,因为未指定正则表达式,任何参数都将匹配email
Spring无法选择适当的端点,并给出错误:映射到HTTP路径的处理程序方法不明确
如果您尝试其他参数,请说:http://localhost:8080/users/somebody@com
,则不会出现错误。斯普林会发现的somebody@example.com与id
不匹配,与email
匹配
正如JB Nizet在评论中提到的,有两种方法可以解决此问题:
为电子邮件指定正则表达式以匹配电子邮件格式,类似于{email:.++.+\..+}
澄清端点,如建议的pDer666:
@GetMapping(value=“/email/{email}”)
@GetMapping(value=“/id/{id:\d+}”)
明确:指定应与findByEmail匹配的正则表达式。明确:指定应与findByEmail匹配的正则表达式。
@GetMapping
@ResponseBody
public String findOne(@RequestParam("id") long id, @RequestParam("email") String email) {
...
}