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

Thymeleaf表单提交后userConsul模型select字段取值为空问题

Thymeleaf表单提交后绑定对象字段全为空问题排查

问题现象

提交表单时采集userConsult信息,调用仓储层Insert方法执行数据库插入,调用示例如下:
userRepo.insertIntoDB(userConsult.getepidemiology);

其余get方法因篇幅过长已省略

程序运行后查询数据库发现:未通过userConsult传值的字段可正常写入,通过userConsult获取的字段均无值。
已完成的基础排查:

  • 使用普通input标签时参数绑定功能正常
  • 手动为Insert方法传入测试参数时数据库插入功能可正常运行
  • 初步怀疑问题与select/option标签相关,但无法定位具体原因
  • 当前项目使用Thymeleaf模板引擎

关联代码

前端表单代码

<form method="POST" th:action="@{/saveConsultation}" th:object="${userConsul}">
    <label for="epidemiology">EPIDEMIOLOGY:</label>
        <select id="epidemiology">
            <option th:each="data : ${consultationData}"
                th:text="${data.epidemiology}"
                th:value="${data.epidemiology}">
        </select>
        <a th:href="@{/saveConsultation/{id}(id = ${patient.patientNumber})}" type="submit">Submit</a>
        <input type="reset" value="Reset diagnosis">
</form><br>

Consultation Controller代码

@RequestMapping("/saveConsultation/{id}")
public String saveConsultation(@ModelAttribute("userConsul") userConsul userConsul,HttpSession session,Model model,@PathVariable("id") int patientID){
    Object USER_SESSION = session.getAttribute("USER_SESSION");
    if (USER_SESSION == null) {
        session.setAttribute("message", "You need to login to access the Consultation page");
        return "redirect:/login";
    }
    User OldUser = (User) USER_SESSION;
    int userId = OldUser.getID();
    userRepository.insertIntoUserCase(userConsul.getEpidemiology(),userConsul.getComplaints(),userConsul.getExamination(),userConsul.getDiagnosis1(),userConsul.getDiagnosis2(),userConsul.getDiagnosis3(),patientID,userId);
    return "test";
}

问题根因及修复

代码存在3个直接导致参数绑定失败的问题,按优先级排序:

  1. 提交控件错误:当前使用<a>标签做提交按钮,a标签触发的是GET地址跳转,不会序列化携带表单内的任何输入数据,所有表单值都不会被发送到后端。
    修复:替换为原生表单提交控件,例如:
    <input type="submit" value="Submit">
    
  2. 表单字段未做Thymeleaf绑定:select标签仅配置了id和option的value属性,没有配置和th:object对象对应的字段绑定规则,也没有原生name属性,表单提交时不会把选中的值纳入请求参数。
    修复:给select标签添加th:field属性绑定对应字段,Thymeleaf会自动生成匹配的name、id属性完成映射:
    <select th:field="*{epidemiology}">
        <option th:each="data : ${consultationData}"
                th:text="${data.epidemiology}"
                th:value="${data.epidemiology}">
        </option>
    </select>
    
    其余表单字段(complaints、examination等)如果是select/input/textarea标签,都需要添加对应的th:field="*{字段名}"完成绑定。
  3. 表单提交路径不匹配:当前form的th:action配置为@{/saveConsultation},和后端接口要求的/saveConsultation/{id}路径不一致,既无法匹配后端接口,也会丢失路径中的patientID参数。
    修复:修改form的action属性为带路径参数的完整地址:
    <form method="POST" th:action="@{/saveConsultation/{id}(id = ${patient.patientNumber})}" th:object="${userConsul}">
    

内容的提问来源于stack exchange,提问作者joshiscamp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.10 16:15:46