#开发笔记
#不想看排查思路和原因直接跳到文章末尾的解决方式
今天在做项目进行 文章置顶 功能时,发现页面有几个参数接收不到,想了半天没想出原因,解决问题要先思考问题
排查思路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;
}
测试
拉取文章列表我是按照时间从新到旧默认排序的(忽略文章内容),可以看到置顶的文章时间更早但是被显示在最上面,说明置顶成功
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)