zoukankan      html  css  js  c++  java
  • SpringMVC表单验证器

    本章讲解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面试题,以及前沿热门资讯等。

  • 相关阅读:
    iOS真机测试中出现dyld`dyld_fatal_error错误
    给WKWebView添加进度条(swift)
    手机号、密码正则判断
    Xcode8 上架前属性列表添加权限
    系统定位
    修改UISearchBar的背景颜色
    iOS 给NSString文字上添加横线 中间和下划线
    iOS UISearchBar 设置取消按钮,回收键盘,并修改cancel为“取消”
    iOS 支付宝第三方使用步骤
    UIImagePickerController和UIAlertController结合使用
  • 原文地址:https://www.cnblogs.com/java-stack/p/11952639.html
Copyright © 2011-2022 走看看