天天看點

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-api

jar包下的

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不同環境配置

看完有沒有收獲?分享到朋友圈給更多的人吧。