如何在不使用th:object的Thymeleaf表单中展示RequestParam错误
无后端对象绑定的Thymeleaf表单参数错误展示方案
th:errors、#fields.hasErrors()默认依赖th:object绑定的表单对象做字段路径映射,不绑定后端对象时直接调用会抛出字段无法识别的异常,以下是无th:object场景下的可行实现:
方案1:字段级错误精准展示(推荐)
Controller层注意点
BindingResult必须紧跟在对应@RequestParam参数后声明,Spring才会完成自动注入,手动添加错误时第一个参数需和请求参数名完全一致:
@PostMapping(value="/submit") public String doSubmit(@RequestParam("myParameter") String param, BindingResult bindingResult) { bindingResult.rejectValue("myParameter", "error.myParameter", "Oh nooo!!!!"); return "html"; }
如果要简化前端代码,可直接将错误信息放入Model:
@PostMapping(value="/submit") public String doSubmit(@RequestParam("myParameter") String param, BindingResult bindingResult, Model model) { bindingResult.rejectValue("myParameter", "error.myParameter", "Oh nooo!!!!"); if (bindingResult.hasFieldErrors("myParameter")) { model.addAttribute("myParameterErr", bindingResult.getFieldError("myParameter").getDefaultMessage()); } return "html"; }
HTML页面写法
如果未手动将错误放入Model,可直接从请求上下文读取Spring自动存放的BindingResult对象:
<form th:action = "@{/submit}" method="post"> <label for="myParameter" class="form-label">My Parameter</label> <input name="myParameter" class="form-control" type="text"/> <span class="text-danger" th:if="${#request.getAttribute('org.springframework.validation.BindingResult.myParameter')?.hasFieldErrors('myParameter')}" th:text="${#request.getAttribute('org.springframework.validation.BindingResult.myParameter').getFieldError('myParameter').defaultMessage}"> Error </span> <button type="submit" class="btn btn-primary">Submit</button> </form>
如果已经把错误信息手动放入Model,前端写法更简洁:
<span class="text-danger" th:if="${myParameterErr != null}" th:text="${myParameterErr}">Error</span>
方案2:全局错误展示
如果表单字段少、不需要精准匹配字段和错误的对应关系,可直接使用全局错误,无需处理字段路径映射:
Controller层
@PostMapping(value="/submit") public String doSubmit(@RequestParam("myParameter") String param, BindingResult bindingResult) { // 直接添加全局错误,不绑定具体字段 bindingResult.reject("error.myParameter", "Oh nooo!!!!"); return "html"; }
HTML页面
<span class="text-danger" th:if="${#fields.hasGlobalErrors()}" th:each="err : ${#fields.globalErrors()}" th:text="${err.defaultMessage}"> Error </span>
多参数表单使用全局错误时,需要自行区分错误对应的表单项。
内容的提问来源于stack exchange,提问作者Thanthla
相关产品推荐
相关产品推荐

