SpringMVC表单验证器

作者: Java技术栈 | 来源:发表于2017-09-30 14:39 被阅读159次

    本章讲解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) {
    ...
    }
    

    推荐阅读

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

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

    相关文章

      网友评论

        本文标题:SpringMVC表单验证器

        本文链接:https://www.haomeiwen.com/subject/qnngextx.html