#前后交互 前端无法正确接收后端布尔类型isXxx字段数据

#前后交互 前端无法正确接收后端布尔类型isXxx字段数据,第1张

#开发笔记

#不想看排查思路和原因直接跳到文章末尾的解决方式

今天在做项目进行 文章置顶 功能时,发现页面有几个参数接收不到,想了半天没想出原因,解决问题要先思考问题

排查思路

bean中的关键字段为(在mapper.xml中做了映射,数据库表中字段名为"is_top")

private boolean isTop; // 开启置顶

1、首先我在页面发送请求前将请求参数打印

我选择了置顶,请求参数中也的确是 isTop=true ,说明前端请求没有问题

2、我通过浏览器地址栏手动拼接参数进行请求

返回的Json数据显示top:true,第一次我只看到true就跳过了,都没注意到名字变了

在又一次请求测试后才反应过来,说明后端传递的参数名发生了该改变

3、在后端断点debug

 再次确定后端没有接收到top的参数

分析

在前端正确,控制器也能正确接收请求的情况下接收请求数据的形参(或bean)没有获取到对应的参数,说明是实体类属性注入有问题

一般情况下要么是字段名对应不上,要么就是接收不到传递的参数,排除后者我们去字段名上寻找问题,我第一时间并没有想到是实体类的字段有问题,而是去检查mapper文件的resultMap定义,检查后发现也没有问题,所以我才去看实体类

实体类属性注入依靠的是bean的setter方法,在此我用的是lombok注解,自动生成了s/g(所以卡了挺久一会才反应过来原因)

于是我使用idea的alt+insert快捷键快速生成s/g方法

    public boolean isTop() {
        return isTop;
    }

    public void setTop(boolean top) {
        isTop = top;
    }

 isTop的setter方法名变成了setTop,is不见了,正常情况下此处g/s应该为getIsTop()和setIsTop(),这就是为什么controller形参接获取不到请求参数的原因

解决

1、更改字段名避免使用isXxx

我们很多人在进行boolean字段建立时会采用isXxx的习惯命名,这样其实是不好的,像本文中出现的问题就是由于该种命名方式导致的解析出现歧义(我之前一直以为isXxx才是对的,看来还得多看看开发规范)

而且很多大厂的开发规范也要求开发人员在字段建立时禁止(注意是禁止不是建议,意思就是强制)使用isXxx,例如阿里

   提醒:更名后别忘记修改mapper字段映射

 2、手动将s/g方法改名

    public boolean getIsTop() {
        return top;
    }

    public void setIsTop(boolean top) {
        this.top = top;
    }
测试 

 拉取文章列表我是按照时间从新到旧默认排序的(忽略文章内容),可以看到置顶的文章时间更早但是被显示在最上面,说明置顶成功

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/734306.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存