验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

SpringMVC @RequestBody属性名大写字母注入失败如何解决

阅读:1051 来源:乙速云 作者:代码code

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;
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>