【问题标题】:MethodArgumentTypeMismatchException in spring boot春季启动中的 MethodArgumentTypeMismatchException
【发布时间】:2019-05-20 00:25:49
【问题描述】:

我尝试通过在 url 中获取 id 来删除用户,但出现错误:

Failed to convert value of type 'java.lang.String' to required type 'int'; 
nested exception is java.lang.NumberFormatException: For input string:

我将 int id 更改为 String id,但随后 deleteMyUser() 将不起作用,因为它接受整数。

代码:

<a href="/delete-user?id=${user.id}">x</a>


@RequestMapping("/delete-user{id}")
    public  String deleteUser(@PathVariable("id") int id,HttpServletRequest request)
    {   
        request.setAttribute("mode","MODE_HOME");
        userService.deleteMyUser(id);

        return "welcome";

    }

【问题讨论】:

  • 检查哪个是html页面中id参数的值(通过查看html页面的源代码)可能是a标签的url中id不是数字
  • 值有效
  • 然后保持a标签像这样&lt;a href="/delete-user?id=${user.id}"&gt;x&lt;/a&gt;并将@RequestMapping("/delete-user{id}")更改为@RequestMapping("/delete-user")@PathVariable("id")更改为@RequestParam("id")

标签: java spring spring-boot request-mapping path-variables


【解决方案1】:

您应该将id 添加到路径,因此删除?id=

<a href="/delete-user${user.id}">x</a>

【讨论】:

  • 如何添加多个变量?
  • @K.Nehe 通常用斜杠将它们分隔为/{id}/{otherId}
【解决方案2】:

问题是你混淆了“查询参数”和“路径变量”

<a href="/delete-user?id=${user.id}">x</a> // Passing value as query param


@RequestMapping("/delete-user{id}") // Expecting Path variable

要解决此问题,请将查询参数或路径变量都更改为(这里我更改为路径变量):

<a href="/delete-user/${user.id}">x</a>



@RequestMapping("/delete-user/{id}")
    public  String deleteUser(@PathVariable("id") int id,HttpServletRequest request)
    {   
        request.setAttribute("mode","MODE_HOME");
        userService.deleteMyUser(id);

        return "welcome";

    }

【讨论】:

  • 您的正确问题是查询参数和路径变量混淆
【解决方案3】:

让我解释一些网址和映射

首先 /user/{id}/{userId} 这是路径变量格式 /user?id=1&userid=2 这是请求参数/查询参数格式。

https://domainname.com/find/user?id=1

@GetMapping("/find/user")
public  String deleteUser(@RequestParam("id") int id){   

}

https://domainname.com/find/user/1

@GetMapping("/find/user/{id}")
public  String deleteUser(@Pathvariable("id") int id){   

}

https://domainname.com/find/user/1/2
@GetMapping("/find/user/{id}/{userid}")
public  String deleteUser(@Pathvariable("id") int id,@Pathvariable("userId") 
int userId){   

}

** 在路径变量的情况下,您的变量是映射的一部分

POST 请求

https://domainname.com/find/user
in request body {"id":1}

@PostMapping("/find/user")
public  String deleteUser(@RequestBody Integer id){   

}
https://domainname.com/find/user/1?userId=2
@GetMapping("/find/user/{id}")
public  String deleteUser(@Pathvariable("id") int id,@RequestParam("userId") 
int userId){   

}

如果您使用的是@RequestMapping,则建议您定义方法,默认情况下它也映射到 get 请求。

@RequestMapping(method = [RequestMethod.GET])

【讨论】:

  • 谢谢我明白了
【解决方案4】:

这个呢:

 RequestMapping("/delete-user/{id}")

在 delete-user 和 id 之间使用斜线,然后调用

<a href="/delete-user/${user.id}">x</a>

还要确保 ${user.id} 包含有效的数字值

【讨论】:

  • 不起作用的问题是我混淆了查询参数和路径变量
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 2017-09-11
  • 2015-04-18
  • 2017-06-24
  • 2015-08-22
相关资源
最近更新 更多