Spring Boot 中的 MethodArgumentTypeMismatchException

3
我试图通过从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不是一个数字。 - user10386912
该值是有效的。 - K.Nehe
a 标签保持为 <a href="/delete-user?id=${user.id}">x</a>,并将 @RequestMapping("/delete-user{id}") 更改为 @RequestMapping("/delete-user"),将 @PathVariable("id") 更改为 @RequestParam("id") - user10386912
4个回答

1
您应该将 id 添加到 path 中,因此请删除 ?id=:
<a href="/delete-user${user.id}">x</a>

我该如何添加多个变量? - K.Nehe
@K.Nehe通常你可以用斜杠分隔它们,例如/{id}/{otherId} - user7294900

1
问题在于您混淆了“查询参数”和“路径变量”。
<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";

    }

你的问题在于查询参数和路径变量混淆。 - K.Nehe

1
让我向您解释一些URL及其映射关系。
首先,/user/{id}/{userId} 是路径变量格式,而/user?id=1&userid=2 则是请求参数/查询参数格式。请注意保留HTML标签。
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])

感谢,我已经理解了。 - K.Nehe

0
这个怎么样?
 RequestMapping("/delete-user/{id}")

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

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

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


无法工作的问题是我混淆了查询参数和路径变量。 - K.Nehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接