SpringMVC表单验证器

简介: 订阅专栏本章讲解SpringMVC中怎么通过注解对表单参数进行验证。SpringBoot配置使用springboot,spring-boot-starter-web会自动引入hiberante-validator,validation-api依赖。在WebMvcConfigurerAdapter实现类里面添加验证器及国际化指定资源文件。

本章讲解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) {
...
}
相关文章
|
8月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
7月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
125 1
|
7月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
8月前
|
前端开发 Java 关系型数据库
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
|
7月前
|
XML Java 数据格式
SpringMVC的XML配置解析-spring18
SpringMVC的XML配置解析-spring18
|
7月前
|
应用服务中间件
从代码角度戳一下springMVC的运行过程-spring16
从代码角度戳一下springMVC的运行过程-spring16
|
前端开发 Java Go
Spring MVC 和 Spring Boot 的区别
Spring MVC 和 Spring Boot 的区别
237 0
|
8月前
|
移动开发 Java 测试技术
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)
196 1
|
Java Spring
springmvc中spring提供的中文乱码解决问题
可以解决浏览器的乱码问题
72 0
|
JSON 前端开发 Java
"《图书管理系统》利用SpringMvc$Spring$MyBatis (实操九)(一) "
"《图书管理系统》利用SpringMvc$Spring$MyBatis (实操九)(一) "
155 0