本章讲解SpringMVC中怎么通过注解对表单参数进行验证。

SpringBoot配置

使用springboot,spring-boot-starter-web会自动引入hiberante-validator,validation-api依赖。

WebMvcConfigurerAdapter实现类里面添加验证器及国际化指定资源文件。

@Override
public Validator getValidator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(messageSource());
return validator;
} @Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("i18n/ValidationMessages");
messageSource.setDefaultEncoding(StandardCharsets.US_ASCII.name());
return messageSource;
}

验证器使用

接收参数的表单类:

public class LoginForm {

    @NotNull(message = "{login.loginName.length}")
@Size(min = 4, max = 20, message = "{login.loginName.length}")
private String loginName; @NotNull(message = "{login.loginPassword.length}")
@Size(min = 8, max = 20, message = "{login.loginPassword.length}")
private String loginPassword; public String getLoginName() {
return loginName;
} public void setLoginName(String loginName) {
this.loginName = loginName;
} public String getLoginPassword() {
return loginPassword;
} public void setLoginPassword(String loginPassword) {
this.loginPassword = loginPassword;
} }

在要验证的字段上面加入验证注解,更多参考validation-apijar包下的javax.validation.constraints包。

SpringMVC控制器:

@PostMapping(value = "/login")
public String login(@Validated LoginForm form) {
...
}

使用@Validated注解表示该参数需要验证。

国际化

message里面{}引用的是国际化的资源。

添加国际化资源文件:

ValidationMessages.properties

ValidationMessages_zh_CN.properties

需要指定编码为ASCII,不然会乱码。

异常处理

异常全局处理时进行处理:

@ControllerAdvice
public class ExceptionResolver { @ExceptionHandler(Throwable.class)
@ResponseBody
Object handleEntityException(HttpServletRequest request, Throwable ex) {
...
if (ex instanceof BindException) {
BindException c = (BindException) ex;
List<ObjectError> errors = c.getBindingResult().getAllErrors();
StringBuilder errorMsg = new StringBuilder();
errors.forEach(x -> errorMsg.append(x.getDefaultMessage()).append(",")); }
...
} }

或者在验证的类后面加BindingResult,错误信息都会放在该对象里面,而不会抛出异常。如:

@PostMapping(value = "/login")
public String login(@Validated LoginForm form, BindingResult bindingResult) {
...
}

推荐阅读

干货:2TB架构师四阶段视频教程

面经:史上最全Java多线程面试题及答案

面经:史上最全阿里高级Java面试题

面经:史上最全Spring面试题

教程:最全Spring Boot全套视频教程

书籍:进阶Java架构师必看的15本书

工具:推荐一款在线创作流程图、思维导图软件

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

SpringMVC表单验证器的更多相关文章

  1. SpringMVC 表单验证

    SpringMVC 表单验证 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 项目结构图 接下来用代码重点学习SpringMVC的表单 ...

  2. Angular5+ 自定义表单验证器

    Angular5+ 自定义表单验证器 Custom Validators 标签(空格分隔): Angular 首先阐述一下遇到的问题: 怎样实现"再次输入密码"的验证(两个cont ...

  3. JFinal极速开发实战-业务功能开发-通用表单验证器

    提交表单数据时,需要经过前端的验证才能提交到后台,而后台的验证器再做一道数据的校验,成功之后才能进入action进行业务数据的处理. 在表单数据的验证中,数据类型的验证还是比较固定的.首先是对录入数据 ...

  4. springmvc表单验证

    http://blog.csdn.net/daryl715/article/details/1645880 http://blog.csdn.net/shuwei003/article/details ...

  5. SpringMVC表单验证与Velocity整合

    阅读本文约“1.2分钟” 定义表单类 以Login为例,有username和password两个字段 import javax.validation.constraints.NotNull; impo ...

  6. 五十四:WTForms表单验证之自定义表单验证器

    如果想要对表单中的某个字段进行自定义验证,则需要对这个字段进行单独的验证1.定义一个方法,命名规则为:validate_字段名(self, filed)2.在方法中,使用filed.data获取字段的 ...

  7. AngularJS自定义表单验证器

    <!doctype html> <html ng-app="myApp"> <head> <script src="G:\\So ...

  8. @valid表单验证demo

    springMVC 表单验证demo  视图层使用的是jsp

  9. 如何优雅的使用 Angular 表单验证

    随便说说,这一节可以跳过 去年参加 ngChine 2018 杭州开发者大会的时候记得有人问我: Worktile 是什么时候开始使用 Angular 的,我说是今年(2018年) 3 月份开始在新模 ...

随机推荐

  1. 故事版(storyBoard)-lllegal configuration connection cannot have a prototype objct as

    今天下午做项目的时候.居然出了一个太不是问题的问题了,这个错误太低级了. lllegal configuration connection 'flagImg' cannot have a protot ...

  2. Quartz的简单使用

    一.Quartz 介绍 Quartz是Java领域最著名的.功能丰富的.开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成--从小的单机应用到大的电子商务系统. Quartz可以用来执行成 ...

  3. k3 cloud套打模板中出现单元格数据为空的情况,及无法正确的选择数据源

    解决办法: 找到右边的导航树,点击数据表格选中,然后到左边点击右键,绑定数据

  4. GeneXus笔记本—常用函数(中)

    这篇文章是接着上一篇 常用函数(上)来写的 上次写到了Format 这个函数 我们继续接着这个往下来好了(づ ̄ 3 ̄)づ  还是一样 函数列表在此 https://wiki.genexus.com/c ...

  5. 3.VUE前端框架学习记录三:Vue组件化编码1

    VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  6. Vue列表渲染-变异方法

    Vue 包含一组观察数组的变异方法,变异方法 (mutation method),顾名思义,会改变被这些方法调用的原始数组 所以它们也将会触发视图更新.这些方法如下: push() pop() shi ...

  7. SpringBoot---Servlet容器(Tomcat)配置

    1.概述 1.1.Tomcat所有属性  都在org,springframework.boot.autoconfigure.web.ServerProperties配置类中作了定义: 2.替换Tomc ...

  8. ImageField 字段的使用

    Django模型中的ImageField和FileField的upload_to选项是必填项,其存储路径是相对于MEIDA_ROOT而来的.

  9. mybatis用distinct进行查询的问题

    一:mybatis进行distinct进行查询的时候,数据库中可能有值为null的. 如果直接这样写,这个null的都给计算出来了. select DISTINCT b.b_city from bui ...

  10. 4412 最简Linux驱动

    最简Linux驱动 必备的头文件 • Linux头文件位置– 类似#include <linux/module.h>的头文件,它们是在Linux源码目录下的include/linux/mo ...