Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring RestController-findById和findByEmail请求方法不工作(处理程序不明确)_Spring_Spring Mvc_Spring Boot_Spring Data Rest - Fatal编程技术网

Spring RestController-findById和findByEmail请求方法不工作(处理程序不明确)

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

我想根据ID或电子邮件检索
用户的信息。下面是我编写的控制器类:

@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) {
        ...
    }