java - Spring MVC 验证表单属性名问题
问题描述
使用 Spring MVC 和 Thymleaf 验证一个非常简单的 HTML 表单时出现了一个奇怪的行为。
我有这种方法用于编辑页面渲染和提交的表单句柄。
@GetMapping("/{id}")
public String editPage(@PathVariable("id") Long id, Model model) {
model.addAttribute("user", userService.findById(id)
.orElseThrow(NotFoundException::new));
return "user_form";
}
@PostMapping("/update")
public String update(@Valid UserRepr user, BindingResult result, Model model) {
logger.info("Update endpoint requested");
if (result.hasErrors()) {
return "user_form";
}
userService.save(user);
return "redirect:/user";
}
update() 方法中的连线事情是,在验证错误的情况下,具有表单内容的模型属性的名称为“userRepr”,但不是我所期望的“user”,因此 thymleaf 表单视图失败。
通过重命名属性很容易解决问题,但是关于这种属性命名是否有一些约定?它是可变的吗?
解决方案
您可以使用@ModelAttribute
.
@ModelAttribute 用于将方法参数或方法返回类型映射/绑定到命名模型属性。请参阅@ModelAttributes JavaDoc。这是一个 Spring 注释。
@PostMapping("/update")
public String update(@Valid @ModelAttribute("user") UserRepr user, BindingResult result, Model model) {
logger.info("Update endpoint requested");
if (result.hasErrors()) {
return "user_form";
}
userService.save(user);
return "redirect:/user";
}
为什么它看起来像这样?
模型对象自动生成属性名称,然后将上述方法调用转发到addAttribute(Object attributeValue)
.
以下是名称生成策略的规则:
- 对于不是集合的对象,将生成短类名。例如对于 java.lang.String,将生成“字符串”。
- 对于集合/数组,“List”附加在元素类型之后,例如“stringList”。集合/数组不应为空,因为逻辑使用第一个元素来查找它的类型。
您可以查看此链接以获取更多详细信息。https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-model-attribute-generated-names.html
推荐阅读
- javascript - 按用户从图中以 JSON 格式获取数据
- java - 如何根据 Java 8 中的某些条件更新现有对象 可选
- mongodb - 如何在mongodb的对象数组中查找具有不同顺序的数据?
- python - 无法在 OpenCV 中使用 SIFT 功能
- swift - 折线未连接到第一个点
- php - 存储在 HTML 表单中选择的选项的变量中
- php - filter() 集合在子查询中不起作用
- vuetify.js - Vuex:发生突变但状态没有改变
- sql - 从 SQL 表中选择列表中的第一个匹配字符串值
- singlestore - 是否可以创建一个由特定 JSON 值数组组成的 PERSISTED 列,如果可以,如何创建?