js前端有数据,后端实体类接收数据为null

1.排查前后端字段是否一致

前端有数据传入

function queryCenterAdd1() {
    var paramMap = {
       "SERIAL_NO":"sdsdad",
        "APPLY_NO":"1",
    };

    $.ajax({
        url: G3.cmdPath + "/rz/unite/add1",
        type: 'post',
        dataType : 'json',
        contentType:'application/json',
        data : JSON.stringify(paramMap),
        success: function(data) {
            G3.alert("提示", '请求成功' + data);
        },
        error: function(error) {
            G3.alert("提示", '请求失败' + error);
        }
    })
}

在网页开发者模式的network中有传入的的数据

 

但是后端接收的实体类对应字段的值为null

跟实体类中的字段进行比较

前端的字段与后端实体类中的是一致的,那么问题应该出在@RequestBody注解和Getter方法上了

2.排查@RequestBody的Getter方法与@Data生成的Getter方法是否一致

1)这里提一点注意事项@RequestBody接受参数的值是通过idea生成的Getter方法进行参数获取,即在实体类通过手动生成的Getter方法

 

 而通过@Data生成的Getter在一些情况下与idea本身生成的Getter是存在差异的

例如:

private String bENT_NAME;

通过@Data生成的为getBENT_NAME();

  public int addUniteTask1(@RequestBody UniteTask uniteTask1) {
        uniteTask1.getSERIAL_NO();
        uniteTask1.getBENT_NAME();
        return 1;
    }

 

 而idea手动生成的Getter为getbENT_NAME()

public String getbENT_NAME() {
        return bENT_NAME;
    }

 这种情况也会导致参数的获取值为null

 2)实际排查Getter方法问题

@Data生成方法getSERIAL_NO();

public int addUniteTask1(@RequestBody UniteTask uniteTask1) {
        uniteTask1.getSERIAL_NO();
        return 1;
    }

idea生成方法getSERIAL_NO();

public String getSERIAL_NO() {
        return SERIAL_NO;
    }

 方法一致,那就只能是实体类中的字段名导致的了

3.修改实体类的字段名,将带有下划线的格式修改为驼峰格式

原本为直接与数据库的字段对应,直接使用带有下划线的字段名称


@Id
    private String SERIAL_NO;  // 业务主键,业务新增、更新、删除的唯一标识
    private String APPLY_NO; // 网上申请号

修改后

 @Id
    @Column(name = "SERIAL_NO")
    private String serialNo;  // 业务主键,业务新增、更新、删除的唯一标识
    @Column(name = "APPLY_NO")
    private String applyNo; // 网上申请号

4.结果测试

1)修改后最好检查以下Getter方法是否一致,或者直接使用手动生成的Getter方法,手动生成的Getter方法会覆盖@Data注解的Getter方法

测试类的代码:

 @RequestMapping({"/add1"})
    @ResponseBody
    public int addUniteTask1(@RequestBody UniteTask uniteTask1) {
        uniteTask1.getSerialNo();
        uniteTask1.getApplyNo();
        return 1;
    }

2)前端的字段也要进行修改,与后端实体类的字段一致

修改后js前端代码

function queryCenterAdd1() {
    var paramMap = {
       "serialNo":"sdsdad",
        "applyNo":"1",
    };

    $.ajax({
        url: G3.cmdPath + "/rz/unite/add1",
        type: 'post',
        dataType : 'json',
        contentType:'application/json',
        data : JSON.stringify(paramMap),
        success: function(data) {
            G3.alert("提示", '请求成功' + data);
        },
        error: function(error) {
            G3.alert("提示", '请求失败' + error);
        }
    })
}

3)测试流程

请求的字段已经变为修改后的字段名,若没有变为修改后的字段名重新运行以下工程,并刷新以下页面,确保工程为最新状态

后端数据

可以看到数据已经传输进来了,问题解决

5.总结 

1)实体类类型,无论是数据库实体类还是非数据库实体类,不要出现直接使用下划线的字段名,最好使用驼峰格式命名

2)gGetter、Setter方法使用@Data注解时,一定要注意是否与idea本身生成的Getter、Setter方法是否一致,若可能,最好直接在实体类中手动生成对应的Getter、Setter等方法,避免出现歧义

3)前后端的数据字段名称一定要保持一致

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值