中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC?@RequestBody屬性名大寫字母注入失敗如何解決

發布時間:2023-04-10 15:45:13 來源:億速云 閱讀:248 作者:iii 欄目:開發技術

這篇文章主要講解了“SpringMVC @RequestBody屬性名大寫字母注入失敗如何解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringMVC @RequestBody屬性名大寫字母注入失敗如何解決”吧!

    @RequestBody屬性名大寫字母注入失敗

    問題描述

    我現在有一個接口通過一個實體去接收一系列的參數,前端傳參為一個JSON字符串,但是當我的屬性名以大寫字母開頭,或者第二個字母是大寫字母的時候,我發現后端接收不到參數值。

    User實體:

    import lombok.Data;
    
    @Data
    public class User{
        private Long id;
        private Integer pId;
        private String Name;
        //getter,setter由lombok自動生成
        //setId, setPId, setName
        //getId, getPId, getName
    }

    前端傳參:

    {
        "id": 1,
        "pId": 70,
        "Name": "Jack"
    }

    接口:

        @PostMapping("/add")
        public void add(@RequestBody User user) {
            System.out.println(user.getId()); // 1
            System.out.println(user.getName());//null
            System.out.println(user.getPId()); // null
        }

    問題分析

    Name接收不到的原因是JavaBean的規范不允許出現這樣的屬性名,即首字母為大寫的屬性名(如:Name, URL, SuV…),這種屬性名直接忽略不注入。

    解決辦法是:在屬性上面添加注解@JsonProperty(value = “Name”)顯式指定名稱的對應關系;

    pId接收不到的原因是JavaBean的規范說如果第一個字母是小寫,第二個字母大寫的情況(如:pId, sUV…),在生成setter/getter的時候直接在前面加上set/get,比如pId的setter/getter是setpId()/getpId(),所以 pId在注入的時候會尋找setpId()方法,而不是setPId()。

    所以解決方案是:1.在屬性上面加注解@JsonProperty(value = “pId”),2.不使用lombok, 手動寫setter -> setpId()

    總結:以上兩種類型名稱注入失敗的原因都是因為Jackson(Spring使用的JSON處理工具)遵守了JavaBean的規范導致的,Jackson給的方案就是通過@JsonProperty顯式指定名稱的對應關系。

    解決方案

    import lombok.Data;
    import com.fasterxml.jackson.annotation.JsonProperty;
    
    @Data
    public class User{
        private Long id;
        
        @JsonProperty(value = "pId")
        private Integer pId;
        
        @JsonProperty(value = "Name")
        private String Name;
        //getter,setter由lombok自動生成
        //setId, setPId, setName
        //getId, getPId, getName
    }
    import com.fasterxml.jackson.annotation.JsonProperty;
    
    public class User{
        private Long id;
        private Integer pId;
        
        @JsonProperty(value = "Name")
        private String Name;
    
        public void setpId(){
            //...
        }
        public Integer getpId(){
            //...
        }
        //other setters,getters
        //...
    }

    @RequestBody時第二個字母大寫,映射不到

    記錄一下遇到的一個問題, 賊難受

    controller

    	/**
         * 添加
         *
         * @param requestNavigationTagVO
         * @return
         */
        @PostMapping("/add")
        public JsonData add(@RequestBody RequestNavigationTagVO requestNavigationTagVO) {
            navigationTagService.add(requestNavigationTagVO);
            return JsonData.ok();
        }

    RequestNavigationTagVO

    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class RequestNavigationTagVO {
        /**
         * id
         */
        private Long id;
    
        /**
         * 所屬導航id
         */
        @NotNull(groups = {AddNavigationTag.class, ModifyNavigationTag.class}, message = "所屬導航id不能為空")
        private Long pId;
    
        /**
         * 標簽名稱
         */
        @NotBlank(groups = {AddNavigationTag.class, ModifyNavigationTag.class}, message = "標簽名稱不能為空")
        private String name;
    
        /**
         * 排序
         */
        @NotNull(groups = {AddNavigationTag.class, ModifyNavigationTag.class}, message = "排序不能為空")
        private Integer sort;
    }

    postman調接口

    {
    	"pId": 654577072911111,
    	"name":"中餐",
    	"sort":1
    }

    這是日志拿到的數據,

    SpringMVC?@RequestBody屬性名大寫字母注入失敗如何解決

    可以看到拿不到pId數據(p_id的駝峰寫法),

    原因: 這里使用的@Data注解(省去了get和set方法)

     public Long getPId() {
            ...
        }
    
     public void setPId(Long PId) {
         ...
     }

    SpringMVC?@RequestBody屬性名大寫字母注入失敗如何解決

    而javaBean的規范導致json傳參首字母大寫將永遠獲取不到

    解決辦法

    1,不去使用首字目大寫或第二個字母大寫的參數

    2,自己生成get和set方法

    SpringMVC?@RequestBody屬性名大寫字母注入失敗如何解決

    3,使用@JsonProperty注解

     @JsonProperty("pId")
     private Long pId;

    感謝各位的閱讀,以上就是“SpringMVC @RequestBody屬性名大寫字母注入失敗如何解決”的內容了,經過本文的學習后,相信大家對SpringMVC @RequestBody屬性名大寫字母注入失敗如何解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    天柱县| 调兵山市| 会宁县| 抚远县| 从化市| 怀化市| 贵溪市| 龙泉市| 灵寿县| 定结县| 连州市| 西丰县| 萨嘎县| 海城市| 汽车| 昭平县| 永济市| 增城市| 历史| 遂昌县| 凤台县| 八宿县| 杂多县| 平泉县| 平邑县| 阜平县| 五寨县| 介休市| 乐都县| 博湖县| 皋兰县| 贺兰县| 丹巴县| 遂昌县| 前郭尔| 凤冈县| 岳阳县| 隆化县| 平顶山市| 扎赉特旗| 武威市|