Spring Boot整合Freemarker更新表数据时触发模板空值异常
报错根因
- 控制器层传参错误:
ProdottoController的/lista接口中,JPA的findById方法返回的是Optional<Prodotto>包装类,你直接将这个Optional对象存入Model传给FreeMarker视图,没有取出包装的实际Prodotto实体。FreeMarker拿到的是Optional容器对象,该类本身没有nome/id/descrizione这些属性,访问对应属性时自然触发空值/不存在错误。 - 模板存在语法笔误:编辑表单的提交按钮闭合标签写错,写成了
/S,不符合HTML标签规范,会导致页面渲染异常。 - 空判断逻辑不严谨:模板中仅判断了
prodottoDaModificare变量是否存在,没有判断变量内部的属性是否可访问,极端场景下仍可能触发空指针。
修复方案
- 修改控制器的产品查询逻辑,将Optional拆包后再传入视图,不要直接传递Optional包装类:
替换/lista方法中的if判断块代码为以下内容:if(idProdotto!=null) { Optional<Prodotto> p = repo.findById(Integer.parseInt(idProdotto)); // 仅当查询到对应产品记录时,才将实体对象加入模型,未查询到则不设置该属性 p.ifPresent(prodotto -> mm.addAttribute("prodottoDaModificare", prodotto)); } - 修正FreeMarker模板中的标签笔误,找到编辑表单的提交按钮行:
<!-- 错误写法 --> <input type="submit" name="invia" value="Salva modifiche"/S> <!-- 替换为正确写法 --> <input type="submit" name="invia" value="Salva modifiche"/> - (可选加固)给模板中
prodottoDaModificare的属性访问加空值兜底,避免极端场景报错,例如将${prodottoDaModificare.nome}写法替换为${(prodottoDaModificare.nome)!''},属性不存在时默认展示空字符串即可。
内容的提问来源于stack exchange,提问作者fabio palladino
相关产品推荐
相关产品推荐

