Spring Framework升级至5.3.9后验证机制替换方案咨询
Spring 5.3.9 替换XML注入Validator的验证方案
原XML配置说明
你之前通过XML为EditAdminController注入adminValidator的方式,属于Spring MVC旧版表单控制器(如SimpleFormController)的配置逻辑,在Spring 5.3.9中推荐使用注解驱动的验证方案替代。
替换方案及步骤
1. 迁移控制器到注解驱动
先把旧的表单控制器改造为@Controller注解标记的常规控制器,替代XML中sessionForm、commandName、formView等配置:
- 用
@Controller标记控制器类 - 用
@GetMapping处理表单展示请求,手动将AdminClass实例放入Model(对应原commandName) - 用
@PostMapping处理表单提交逻辑
2. 验证逻辑的两种实现方式
方式一:JSR-380注解 + @Validated(推荐)
你找到的示例代码正是这种标准方案,完全可行,适配你的场景步骤如下:
- 确保项目引入Bean Validation依赖(如Hibernate Validator,Spring 5.3.9会自动兼容)
- 在
AdminClass上添加验证注解(如@NotNull、@Size),需要分组验证可定义分组接口(类似示例中的BasicInfo) - 在控制器提交方法中按规范编写:
@Controller public class EditAdminController { private final AdminDAO adminDAO; // 构造函数注入DAO,替代XML的dao属性配置 public EditAdminController(AdminDAO adminDAO) { this.adminDAO = adminDAO; } // 展示编辑表单,对应原XML的formView @GetMapping("/editAdmin") public String showEditForm(Model model) { // 对应原XML的commandName和commandClass model.addAttribute("AdminClass", new AdminClass()); return "Admin"; } // 处理表单提交 @PostMapping("/editAdmin") public String submitEditForm( @Validated @ModelAttribute("AdminClass") AdminClass adminClass, BindingResult result, HttpSession session) { // 验证失败返回原表单页面 if (result.hasErrors()) { return "Admin"; } // 执行业务逻辑 adminDAO.save(adminClass); // 验证成功跳转成功页面,对应原XML的successView return "view_admin.html"; } }
方式二:保留自定义adminValidator逻辑
如果想复用原adminValidator的验证逻辑,可按以下方式改造:
- 确保
adminValidator实现org.springframework.validation.Validator接口 - 将
adminValidator注册为Spring Bean(用@Component或配置类@Bean定义,替代XML配置) - 在控制器中注入并手动调用验证:
@Controller public class EditAdminController { private final AdminDAO adminDAO; private final AdminValidator adminValidator; public EditAdminController(AdminDAO adminDAO, AdminValidator adminValidator) { this.adminDAO = adminDAO; this.adminValidator = adminValidator; } @GetMapping("/editAdmin") public String showEditForm(Model model) { model.addAttribute("AdminClass", new AdminClass()); return "Admin"; } @PostMapping("/editAdmin") public String submitEditForm( @ModelAttribute("AdminClass") AdminClass adminClass, BindingResult result) { // 手动调用自定义验证器 adminValidator.validate(adminClass, result); if (result.hasErrors()) { return "Admin"; } adminDAO.save(adminClass); return "view_admin.html"; } }
你的示例代码可行性确认
你找到的示例代码是Spring MVC注解驱动验证的标准写法,完全可行:
@Validated用于触发Bean Validation验证,支持分组规则@ModelAttribute实现请求参数到实体类的绑定BindingResult必须紧跟在被验证参数之后,用于接收错误信息- 通过
result.hasErrors()判断验证结果并分支处理
额外注意点
- 原XML中的
sessionForm和synchronizeOnSession:若需在会话中保留表单对象,可在控制器类上添加@SessionAttributes("AdminClass"),处理完提交后用SessionStatus.setComplete()清除;会话同步可通过@RequestMapping的sync属性实现。 - 依赖检查:确保项目包含
spring-webmvc及Bean Validation实现(如hibernate-validator)。
内容的提问来源于stack exchange,提问作者user3067524
相关产品推荐
相关产品推荐

