报错IllegalStateException:请求属性无credential的BindingResult或目标对象
解决IllegalStateException: Neither BindingResult nor plain target object for bean name 'credential' available as request attribute
问题重现
触发如下错误:
Neither BindingResult nor plain target object for bean name 'credential' available as request attribute
关联代码如下:
Thymeleaf模板片段
<form action="#" method="POST" th:action="@{/credentials}" th:object="${credential}"> <input type="hidden" name="credentialId" th:field="*{credentialId}" id="credential-id"> </form>
Credential数据类
@Data @AllArgsConstructor @NoArgsConstructor public class Credential { private Integer credentialId; private String url; private String userName; private String key; private String password; private Integer userid; }
原因分析
- Model对象名称不匹配:你提到已将
credentials添加到Model,但模板th:object引用的是credential(单数),名称不一致会导致Thymeleaf无法找到绑定目标。 - GET请求未初始化空对象:首次访问页面(GET请求)时,若未往Model中放入空的
Credential实例,Thymeleaf无法完成表单与对象的绑定。 - POST请求失败后未重新绑定对象:如果POST请求出现参数绑定/校验错误,未将
credential对象(含用户输入内容)重新放回Model,跳转回页面时会丢失目标对象。
解决方案
1. 修正Model中对象的名称
确保后端存入Model的对象名称与模板th:object一致,示例:
@GetMapping("/form-page") public String showCredentialForm(Model model) { // 新增场景:放入空对象;编辑场景:放入查询到的Credential实例 model.addAttribute("credential", new Credential()); return "your-template-name"; }
2. 处理POST请求的错误场景
在POST处理方法中添加BindingResult参数,校验失败时重新将credential放回Model:
@PostMapping("/credentials") public String submitCredential(@ModelAttribute("credential") Credential credential, BindingResult result, Model model) { if (result.hasErrors()) { // 校验失败,将对象重新放回Model,确保页面能正常渲染 model.addAttribute("credential", credential); return "your-template-name"; } // 正常业务逻辑处理 return "redirect:/success"; }
3. 确保@ModelAttribute名称匹配
如果手动指定@ModelAttribute的名称,必须与th:object的${credential}一致;若省略名称,Spring默认使用类名首字母小写(即credential),此时无需额外指定。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

