Fork me on GitHub

Spring MVC表单验证器的使用

在这里插入图片描述

SpringMVC表单验证器的使用

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

SpringBoot配置

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

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

1
2
3
4
5
6
7
8
9
10
11
@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;
}

验证器使用

接收参数的表单类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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控制器:

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

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

国际化

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

添加国际化资源文件:

ValidationMessages.properties ValidationMessageszhCN.properties

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

异常处理

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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,错误信息都会放在该对象里面,而不会抛出异常。如:

1
2
3
4
@PostMapping(value = "/login")
public String login(@Validated LoginForm form, BindingResult bindingResult) {
...
}
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!