Post请求后端接收不到数据

问题概述:

接口:

@RestController
public class TestController {
    @PostMapping("/test")
    public void testPost(@RequestBody Discipline discipline){
        System.out.println("================================");
        System.out.println(discipline.toString());
    }
}

实体类:

 @ApiModelProperty(value = "处理人,role=3")
    @Getter
    @Setter
    private String mId;

前端:

 methods:{
    test(){
      this.$http.post(`test`,{mId:888})
    }
  }

测试:

通常情况下,后端打印出来的mId应该为:888,但是真实的结果是

为什么会出现这样的情况?

       Spring Boot 默认使用 Jackson 库进行 JSON 序列化和反序列化,项目中我使用了Lombok来生成getter和setter。

  1. Lombok的注解生成规则:

    1. 当Lombok生成getter和setter方法时,它会将属性名的第一个字母变为大写,即使属性名的首字母是小写的。

    2. 对于首字母小写,第二个字母大写的属性名,Lombok会保持这种大小写格式,例如属性名为cId,getter和setter方法将为getCId和setCId。
  2. Jackson的序列化规则:

    • Jackson在序列化时会使用getter方法来确定属性的名称。
    • 如果getter方法的名称与属性名称不匹配,Jackson将使用getter的名称作为JSON属性的名称。
    • Jackson处理getter和setter方法时,会将get或set前缀去掉,并将其后的连续大写字符转换成小写字符返回。

举例:

@Getter
@Setter
public class User {

    private String mId;

    public static void main(String[] args) throws Exception {
        User user = new User();
        user.setMId("123");
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);  // 输出: {"mid":"123"}
    }
}

编译后的字节码文件

public class User {
    private String mId;

    public User() {
    }

    public static void main(String[] args) throws Exception {
        String param = "{\"mid\":\"123\"}";
        User user = new User();
        user.setMId("123");
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);
    }

    public String getMId() {
        return this.mId;
    }

    public void setMId(final String mId) {
        this.mId = mId;
    }
}

注意到mId的get方法被lombok生成为getMIdJackson默认行为是将字段名称中的连续大写字母视为一个单词的开始,并将它们转换为小写,因此被序列化成了mid。

如果将上述栗子中,mId改为mIAd,那么结果就是miad.

解决:

最好的办法是数据库字段命名可以设计成这样:manager_id,对应实体字段:mangerId

如果项目修改很麻烦,可以在Java实体类的属性加上JsonProperty注解

@JsonProperty("mId")
private String mId;

重启后再看一下结果,问题迎刃而解 

你可能感兴趣的:(java,前端,vue,spring,boot,笔记)