今天项目里出现了一个小问题,在测试对员工表模糊条件查询的时候,发现用前端页面上能正常运行,但是在postman测试时,就会报空指针异常。
先看接口文档里前端请求数据样例:
/emps?name=张&gender=1&begin=2007-09-01&end=2022-09-01&page=1&pageSize=10
在java程序中参数name是String类型,因为是模糊查询,所以在业务层使用了trim()方法,去除了name首尾的空格。问题就出在这里,完成功能之后使用postman进行测试,因为是条件查询,所以name可以不传值。
postman中的请求
http://localhost:8080/emps?page=1&pageSize=5
前端页面的请求
http://localhost:90/api/emps?name=&gender=&begin=&end=&page=1&pageSize=5
在postman中发送请求时,会产生空指针异常,这很好理解,因为name没有值是NULL,所以在调用trim()方法时会空指针异常,但是前端页面为什么不会报错呢?
接下来使用断点调试看看其中的原因:
postman请求下接收到的数据:
page = {Integer@9141} 1
pageSize = {Integer@9142} 5
name = null
gender = null
begin = null
end = null
前端请求下接收到的数据:
page = {Integer@7808} 1
pageSize = {Integer@7809} 5
name = ""
gender = null
begin = null
end = null
不难看出,在name没有拼接在url后面的时候,String类型的name的值为null,但是name在拼接到url后面之后,name接收到的数据是""(空字符串)。
由此得出结论,对于String类型,在前端没有传递值的情况下,后端接收到的都是空字符串,而不是null。
由这个结论可以得出一个重要的注意事项,那就是以后在写动态sql的时候,如果字段类型是String,那么在if条件里面一定要判断是否为空字符串,不然很有可能会产生错误哦,你学到了吗?
#正确示范
<if test="name != null and name != ''">
name = #{name},
</if>
#错误写法
<if test="name != null">
name = #{name},
</if>