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)前后端的数据字段名称一定要保持一致

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端动态增加和删除输入框的实现可以使用 jQuery 或者原生 JavaScript,通过 DOM 操作来实现。具体可以参考以下代码: ``` // 添加输入框 $("#addBtn").click(function() { var inputHtml = '<input type="text" name="inputs[]" />'; $("#inputContainer").append(inputHtml); }); // 删除输入框 $("#delBtn").click(function() { $("#inputContainer input:last-child").remove(); }); ``` 其中,`#addBtn` 和 `#delBtn` 分别是添加和删除按钮的 ID,`#inputContainer` 是存放输入框的容器的 ID。 后端接收动态增加的输入框数据可以通过 Spring MVC 的 @RequestParam 注解来实现。具体代码如下: ``` @RequestMapping(value = "/submit", method = RequestMethod.POST) public String submit(@RequestParam("inputs[]") List<String> inputs, Model model) { // 处理数据 model.addAttribute("result", "success"); return "result"; } ``` 其中 `@RequestParam("inputs[]")` 表示接收名为 `inputs[]` 的数组参数,对应前端动态增加的输入框的 name 属性。 实现 CRUD 操作可以使用 MyBatis 动态 SQL 实现。具体可以参考以下代码: ``` // 查询数据 List<Data> dataList = dataMapper.selectAll(); // 新增数据 Data data = new Data(); data.setName("test"); dataMapper.insert(data); // 修改数据 Data data = dataMapper.selectById(1); data.setName("test2"); dataMapper.update(data); // 删除数据 dataMapper.deleteById(1); ``` 其中,`Data` 是数据实体类,`dataMapper` 是对应的 Mapper 接口,可以使用 MyBatis Generator 自动生成。 在使用 MyBatis 动态 SQL 时,可以使用 `<if>` 标签来实现条件判断,例如: ``` <select id="selectByCondition" parameterType="map" resultMap="BaseResultMap"> select * from data <where> <if test="name != null"> and name = #{name} </if> <if test="status != null"> and status = #{status} </if> </where> </select> ``` 以上代码中,`<if>` 标签中的 test 属性表示条件判断表达式,如果为 true,则包含该条件;否则不包含该条件。这样就可以根据前端传递过来的条件来动态构建 SQL 语句,实现查询操作。其他操作也可以使用类似的方式实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值