SpringMVC表单验证器

来源:互联网 发布:c语言转义字符怎么用 编辑:程序博客网 时间:2024/06/15 08:44

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

SpringBoot配置

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

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

@Overridepublic Validator getValidator() {    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();    validator.setValidationMessageSource(messageSource());    return validator;}@Beanpublic 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,不然会乱码。

异常处理

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

@ControllerAdvicepublic 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) {...}

推荐阅读

什么是Spring Boot?
Spring Boot开启的2种方式
Spring Boot Starters启动器
Spring Boot定制启动图案
Spring Boot核心配置
Spring Boot功能实战
Spring Boot自动配置原理、实战
Spring Boot Runner启动器
Spring Boot - Profile不同环境配置

看完有没有收获?分享到朋友圈给更多的人吧。


原创粉丝点击