場景
在Spring中使用參數檢驗,最常用的是使用註解的方法**@Valid**
如下:
//定義bean
public class ApplyParams extends Params{
@Override
@NotBlank(message = "標題不能爲空")
@Length(max = 30,message = "標題最多30字")
public String getTitle() {
return super.getTitle();
}
@Override
@NotBlank(message = "目標郵件不能爲空")
public String getTargetEmail() {
return super.getTargetEmail();
}
}
//使用時
@RequestMapping("/insert")
public String insert (@Valid ApplyParams param, HttpServletRequest request){
....
}
可以使用BindingResult或捕獲BindingException異常,來處理失敗的結果.
有時候需要 動態的,有條件的 去校驗參數
比如預約發郵件,有需求修改一個郵件,
- 在郵件還沒有發出去,可以修改,校驗郵件內容的有效性,
- 如果郵件已經發出去了,則不能修改了.
這裏就需要先判斷下郵件是否發出去了.
這時就可以使用org.springframework.validation.SmartValidator.
SmartValidator
SmartValidator 的SpringBean初始化時就初始化到IOC容器中. 在使用時,可以直接注入使用.使用方式如下:
@Qualifier("defaultValidator") //默認LocalValidatorFactoryBean
@Autowired
SmartValidator validator;
//
//...............
//
BindingResult br = new BeanPropertyBindingResult(param,param.getClass().getSimpleName());
validator.validate(param,br);
if(br.hasErrors()){
String errorMesssage = "參數錯誤: ";
for (FieldError fieldError : br.getFieldErrors()) {
errorMesssage += fieldError.getDefaultMessage() + ", ";
}
return ResultPojo.Err(errorMesssage);
}
默認關係有下圖:
SmartValidator有兩個方法:
- void validate(Object target, Errors errors); //繼承自 Validator
- void validate(Object target, Errors errors, Object... validationHints);
各參數
- target : 是指需要校驗的bean, 例如: ApplyParams
- errors : 當校驗失敗時的錯誤處理
- validationHints : 校驗命中的策略,比如分組
SmartValidator 最終還是使用的hibernate-validator來做的參數校驗