You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:24:29