SpringBoot+Thymeleaf表单提交报错:缺少projektId请求参数
添加工人到项目时出现请求参数缺失错误
问题描述
开发一个基于SpringBoot+Thymeleaf+数据库的系统,功能是通过输入项目ID和工人ID,将工人加入对应项目的工人列表。提交表单后出现报错:
Required request parameter 'projektId' for method parameter type String is not present
现有代码
HTML表单代码
<form action="#" th:action="@{neuenMitarbeiterzuProjektHinzufuegen}" method="post"> Projekt ID: <input type="text" th:value="*{projektId}" required/><br> Mitarbeiter ID: <input type="text" th:value="*{mitarbeiterId}" required/><br> <br> <input type="submit" value="Mitarbeiter hinzufügen"/> <input type="reset" value="Clear"/> </form>
Controller处理方法代码
@PostMapping(value="/neuenMitarbeiterzuProjektHinzufuegen") public String neuenMitarbeiterzuProjektHinzufuegen(@RequestAttribute(value = "projektId") String projektID, @RequestAttribute(value = "mitarbeiterId") String mitarbeiterID,Model m) { Optional<Projekt> projekt = projektRepository.findById(Long.parseLong(projektID)); projektRepository.findById(Long.parseLong(projektID)).get().mitarbeiterHinzufuegen(mitarbeiterRepository.findById(Long.parseLong(mitarbeiterID)).get()); return "redirect:Projekte"; }
问题原因
- 表单input缺少name属性:HTML表单提交时,参数通过
name属性标识,当前input仅用了th:value,没有设置name,导致后端无法识别提交的参数名。 - 注解使用错误:
@RequestAttribute用于获取请求处理链中设置的属性(如拦截器存入的属性),而表单提交的是HTTP请求参数,应该使用@RequestParam注解。 - 原代码存在空指针风险:直接调用
Optional.get(),若项目或工人ID不存在会抛出NullPointerException,且修改后未保存项目到数据库,无法持久化修改。
解决方案
1. 修正HTML表单,添加name属性
如果没有使用表单对象,直接给input添加name属性,与后端参数名一致:
<form action="#" th:action="@{/neuenMitarbeiterzuProjektHinzufuegen}" method="post"> Projekt ID: <input type="text" name="projektId" required><br> Mitarbeiter ID: <input type="text" name="mitarbeiterId" required><br> <br> <input type="submit" value="Mitarbeiter hinzufügen"/> <input type="reset" value="Clear"/> </form>
如果使用表单对象(如定义AddWorkerForm类包含projektId和mitarbeiterId字段),推荐用th:field自动绑定,同时生成正确的name属性:
<form action="#" th:action="@{/neuenMitarbeiterzuProjektHinzufuegen}" method="post" th:object="${addWorkerForm}"> Projekt ID: <input type="text" th:field="*{projektId}" required><br> Mitarbeiter ID: <input type="text" th:field="*{mitarbeiterId}" required><br> <br> <input type="submit" value="Mitarbeiter hinzufügen"/> <input type="reset" value="Clear"/> </form>
2. 修正Controller方法
替换注解为@RequestParam,并修复空指针和持久化问题:
@PostMapping(value="/neuenMitarbeiterzuProjektHinzufuegen") public String neuenMitarbeiterzuProjektHinzufuegen(@RequestParam("projektId") String projektID, @RequestParam("mitarbeiterId") String mitarbeiterID, Model m) { // 检查项目和工人是否存在 Optional<Projekt> projektOpt = projektRepository.findById(Long.parseLong(projektID)); Optional<Mitarbeiter> mitarbeiterOpt = mitarbeiterRepository.findById(Long.parseLong(mitarbeiterID)); if (projektOpt.isPresent() && mitarbeiterOpt.isPresent()) { Projekt projekt = projektOpt.get(); projekt.mitarbeiterHinzufuegen(mitarbeiterOpt.get()); projektRepository.save(projekt); // 保存修改后的项目到数据库 } return "redirect:/Projekte"; }
内容的提问来源于stack exchange,提问作者TrYxer
相关产品推荐
相关产品推荐

