Spring分页搜索功能报错:String转Integer失败,求修复方案
问题:Spring Boot Web应用分页+搜索功能出现类型转换错误
错误信息
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: "{pageNumber}" org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: "{pageNumber}"
现有代码
Controller方法
@GetMapping(value = "/medecin/{pageNumber}") public String list(@PathVariable Integer pageNumber, Model model, @RequestParam(name = "size", defaultValue = "4") int size, @RequestParam(name = "keyWord", defaultValue = "") String keyWord) { Page<Medecin> page ; if (keyWord==null) page = medecinRepository.findAll(PageRequest.of(pageNumber - 1, size)); else page = medecinRepository.findByNomContains(keyWord, PageRequest.of(pageNumber - 1, size)); List<Medecin> medecinList = page.getContent(); long totalItems = page.getTotalElements(); int totalPages = page.getTotalPages(); model.addAttribute("list", medecinList); model.addAttribute("totalItems", totalItems); model.addAttribute("totalPages", totalPages); model.addAttribute("pageNumber", pageNumber); return "medecin/list"; }
HTML表单代码
<form th:action="@{/medecin/{pageNumber}}"> <button type="submit" class="btn btn-primary">CHERCHER</button> <input type="text" name="keyWord" th:value="${keyWord}"> </form>
注:将表单action改为@{/medecin/1}时应用可正常运行,需修复问题并支持搜索结果多页切换。
问题原因
Thymeleaf的@{/medecin/{pageNumber}}语法中,{pageNumber}是路径变量占位符,但未绑定模型中的实际变量值,导致表单提交时直接发送字符串{pageNumber}到后端,后端尝试将其转为Integer类型时抛出NumberFormatException。
修复方案
1. 修正表单action的路径变量绑定
修改表单action,绑定模型中的pageNumber变量,同时确保搜索请求携带keyWord参数:
<form th:action="@{/medecin/{page}(page=${pageNumber}, keyWord=${keyWord})}" method="get"> <input type="text" name="keyWord" th:value="${keyWord}"> <button type="submit" class="btn btn-primary">CHERCHER</button> </form>
或更简洁的写法(Thymeleaf会自动拼接当前请求的参数):
<form th:action="@{/medecin/{pageNumber}(pageNumber=${pageNumber})}" method="get"> <input type="text" name="keyWord" th:value="${keyWord}"> <button type="submit" class="btn btn-primary">CHERCHER</button> </form>
2. 优化Controller中的空值判断
原代码中if (keyWord==null)判断无效,因为@RequestParam设置了defaultValue = "",keyWord永远不会为null,只会是空字符串,修正逻辑:
if (keyWord.isEmpty()) page = medecinRepository.findAll(PageRequest.of(pageNumber - 1, size)); else page = medecinRepository.findByNomContains(keyWord, PageRequest.of(pageNumber - 1, size));
3. 分页切换时携带搜索关键词
分页导航链接需携带keyWord参数,保证分页切换时保留搜索条件:
<a th:href="@{/medecin/{page}(page=${pageNumber + 1}, keyWord=${keyWord})}">下一页</a> <a th:href="@{/medecin/{page}(page=${pageNumber - 1}, keyWord=${keyWord})}">上一页</a>
以上修改可解决类型转换错误,同时实现搜索结果的多页切换功能。
内容的提问来源于stack exchange,提问作者user17229488
相关产品推荐
相关产品推荐

