一、什么是ArgumentTypeMismatch
ArgumentTypeMismatch是Spring框架中的一个异常类型,一般在调用方法时,传入的参数类型与方法所需参数类型不一致时会抛出此异常。
public class UserController {
@GetMapping("/user")
public String getUser(@RequestParam("id") Long id) {
User user = userService.getUserById(id);
// do something...
return "user";
}
}
// 当请求参数为字符串类型时,将会抛出ArgumentTypeMismatch异常
// eg. http://localhost/user?id=abc
上述代码中,当我们在请求参数中传入一个字符串类型的id参数时,将会触发ArgumentTypeMismatch异常,因为getUser方法需要一个Long类型的id参数。
二、为什么会出现ArgumentTypeMismatch异常
出现ArgumentTypeMismatch异常的原因有很多种,本小节主要探讨以下两种常见情况:
1.前端传参类型不正确
当前端传递参数时,如果参数类型与后端接口要求的类型不一致,将会出现ArgumentTypeMismatch异常。
// 前端代码
$.ajax({
url: "/user",
type: "GET",
dataType: "json",
data: {id: "abc"},
success: function (data) {
// do something...
}
});
// 后端代码
public class UserController {
@GetMapping("/user")
public String getUser(@RequestParam("id") Long id) {
User user = userService.getUserById(id);
// do something...
return "user";
}
}
// 将会抛出ArgumentTypeMismatch异常
上述代码中,前端通过ajax请求后端的/user接口,并且将id参数传递为字符串类型。而后端接口需要的是Long类型的id参数,将会出现异常。
2.表单提交参数类型不正确
当使用表单提交数据时,如果传递参数类型与后端接口要求的类型不一致,同样会出现ArgumentTypeMismatch异常。
// 前端代码
<form action="/user" method="POST">
<input type="text" name="id" value="abc">
<button type="submit">提交</button>
</form>
// 后端代码
public class UserController {
@PostMapping("/user")
public String updateUser(@RequestParam("id") Long id) {
userService.updateUserById(id);
// do something...
return "user";
}
}
// 将会抛出ArgumentTypeMismatch异常
上述代码中,表单中的id参数为字符串类型,而后端接口需要Long类型的id参数,将会出现异常。
三、如何避免ArgumentTypeMismatch异常
针对出现ArgumentTypeMismatch异常的情况,我们可以做以下几点来避免异常的出现:
1.前后端保持一致
在前后端数据传递时,需要确保前后端保持一致的类型。
// 前端代码,传递Long类型的id参数
$.ajax({
url: "/user",
type: "GET",
dataType: "json",
data: {id: 1},
success: function (data) {
// do something...
}
});
// 后端代码,需要Long类型的id参数
public class UserController {
@GetMapping("/user")
public String getUser(@RequestParam("id") Long id) {
User user = userService.getUserById(id);
// do something...
return "user";
}
}
2.参数类型转换
当出现参数类型不匹配的情况时,我们可以通过参数类型转换来解决异常。
// 后端代码,将String类型的参数转换成Long类型
public class UserController {
@PostMapping("/user")
public String updateUser(@RequestParam("id") String id) {
Long userId = Long.valueOf(id);
userService.updateUserById(userId);
// do something...
return "user";
}
}
3.使用@RequestParam注解
针对考虑不周全,前后端类型不一致的情况,我们可以使用@RequestParam注解来明确指定参数类型,避免ArgumentTypeMismatch异常的出现。
// 前端代码,传递字符串类型的id参数
$.ajax({
url: "/user",
type: "GET",
dataType: "json",
data: {id: "1"},
success: function (data) {
// do something...
}
});
// 后端代码,使用@RequestParam注解来指定参数类型
public class UserController {
@GetMapping("/user")
public String getUser(@RequestParam("id") Long id) {
User user = userService.getUserById(id);
// do something...
return "user";
}
}
四、ArgumentTypeMismatch异常的作用
ArgumentTypeMismatch异常只是一个提醒,提醒我们在参数传递过程中出现了类型不匹配的情况。
出现该异常时,我们需要检查前后端数据类型是否一致,以及是否需要进行参数类型转换。
五、总结
ArgumentTypeMismatch异常是Spring框架中的一个异常类型,当参数类型不匹配时,将会抛出该异常。为避免该异常的出现,我们需要在前后端交互时明确参数类型,以及必要时进行类型转换。
原创文章,作者:HXZW,如若转载,请注明出处:https://www.506064.com/n/133918.html
微信扫一扫
支付宝扫一扫