本章講解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不同環境配置看完有沒有收獲?分享到朋友圈給更多的人吧。