想写个小Demo玩玩,结果刚提交就给我报了个这个错,记录一下,也给遇到了这个问题的同僚参考一下,结合了一些网上的解决办法。
1、前后端传参名称不一致
如:前端传参:
后端参数:
public ResultInfo Login(@RequestParam("usernmae") String username, @RequestParam("password") String password, @RequestParam("validCode") Long validCode) {
}
以上前端发送username后端要求的参数写成了usernmae,这种问题最简单最好找。
2、前端传参非JSON对象,或错误的JSON对象
前端:
data: '{
"userName":"local_student",
"newPassword":"test1231",
"guid":"376ed5f7-a780-455e-8682-6b5cf45cff80"
}'
后端:
public ResultInfo Login(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("validCode") Long validCode) {
}
改成正确的json格式数据即可:
data: {
username:"aaaaa",
password:"11111",
validCode: "1234"
},
3、请求中的content-type类型不合适
表单提交的conten-type是:application/x-www-form-urlencoded 或文件上传表单:multipart/form-data
而实际提交的请求中content-type 未指定可能是:text/plain 或者 application/json ,导致后台直接以一个字符串接受,没有将其封装到对象里面,自然获取失败。
我就是提交表单未设置content-type,而默认的 content-type是application/json 导致的。
4、不能叫解决方法的解决方法
看到很多人直接修改后台注解;
@RequestParam("username" ) String username 改成 @RequestParam(value = "username",required = false) String username
这种方法其实严格来说不算解决方法,因为@RequestParam注解就是要求请求参数中必须含有该注解标注的参数,如上,要求请求参数中必须携带名字为username的参数,而required = false 则表示不要求请求参数中必须携带名字为username的参数,其实就和没用注解一样。查看@RequestParam注解,可以发现,默认的required是true的,也就是说设置 required = false,@RequestParam注解就无效了,也就不要求必须传入该参数,但是会使用这个注解不就是想要求这个参数必填嘛,所以说这个解决方法不能叫解决方法。
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}