目录
一、问题背景
需要开发一个页面通用查询功能,在后端生成查询语句,所有表单数据页面调用这个接口可以实现通用查询,但因为参数比较复杂(参数实体里面含另一个List实体),GetMapping无法正常解析所以该用PostMapping,但是发现分页失效。
二、问题分析
若依框架的分页失效目前知道三种原因:分页参数没生效、开启分页配置后不止一个查询语句、查询语句不支持若依框架的分页工具(例如JdbcTemplate)
坑一:查询表单的接口使用的PostMapping
坑二:查询使用的JdbcTemplate非MyBatis
三、BUG定位
1、确保开启分页功能(PageUtils.startPage())的代码后只有一个接口结果的查询语句
2、查看分页参数有无生效:
点进PageUtils.startPage()方法,打断点调试发现分页参数为null,若依框架获取分页参数是解析request请求(URL)获取的分页参数,GetMapping是会自动解析URL参数所以可以正常在URL中获取分页参数
3、查看查询语句是否支持分页
为了只测试查询是否支持分页,在查询之前写死分页参数PageUtils.startPage(1,1);
最初版本使用的jdbcTemplate.queryForList方法查询结果集数据,发现分页不生效
四、解决方案
1、因为查询的参数比较复杂,里面嵌套了一个List所以改为请求方式PostMapping
可以修改PostMapping为GetMapping,把原本的List参数改为String类型,后端再转换为List,这样就可以正常解析URL中的分页参数
2、在PostMapping的接口中,在参数实体里面加上分页参数,达到可以正常接收分页参数的目的
3、把JdbcTemplate查询方式改为Mybatis查询(必须)
4、报错java.lang.UnsupportedOperationException原因为,查询时resultType="java.util.List",改为resultType="java.util.Map"就可以了
五、BUG总结
1、正常查询接口都是GetMapping,所以若依框架的分页功能只解析URL中的分页参数,如果特殊情况使用到PostMapping就要自己定义参数去接这两个分页参数。
2、想要解决BUG就是一步一步往上看就好了,发现哪里的问题就解决哪里
本人纯Java菜鸟,欢迎各位大佬补充纠正