1. 程式人生 > 其它 >Required String parameter ‘username‘ is not present

Required String parameter ‘username‘ is not present

技術標籤:springmvcjavaspringajax

想寫個小Demo玩玩,結果剛提交就給我報了個這個錯,記錄一下,也給遇到了這個問題的同僚參考一下,結合了一些網上的解決辦法。

1、前後端傳參名稱不一致

如:前端傳參:

後端引數:

public ResultInfo Login(@RequestParam("usernmae") String username, @RequestParam("password") String password, @RequestParam("validCode") Long validCode) {
}

這個問題最簡單最好找。

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" ) Stringusername 改成 @RequestParam(value = "username",required = false)Stringusername

這種方法其實嚴格來說不算解決方法,因為@RequestParam註解就是要求請求引數中必須含有該註解標註的引數,如上,要求請求引數中必須攜帶名字為username的引數,而required = false 則表示不要求請求引數中必須攜帶名字為username的引數,其實就和沒用註解一樣。檢視@RequestParam註解,可以發現,預設的required是true的,也就是說設定required = [email protected]註解就無效了,但是會使用這個註解不就是想要求這個引數必填嘛,所以說這個解決方法是不能叫解決方法的。

@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";
}