參考1:https://www.jianshu.com/p/f65228a5fe3e
參考2:https://www.jianshu.com/p/0bfe2318814f
參考3:https://blog.csdn.net/qq_34902684/article/details/78534680
1、實現Validator接口,定義驗證器直接在方法中使用,定義方法如下,實現supports方法和validate方法:
package validator;
import domain.Goods;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import java.util.Date;
/**
* @author: yinzhenying
* @date: 2020-02-22 22:15
* @desc:
*/
@Component
public class GoodsValidator implements Validator {
public boolean supports(Class<?> clazz ){
return Goods.class.isAssignableFrom(clazz);
}
public void validate(Object object, Errors errors){
Goods goods = (Goods) object;
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"gname","goods.gname.required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors,"gdescription", "goods.gdescription.required");
if(goods.getGprice()>100||goods.getGprice()<0){
errors.rejectValue("gprice","gprice.invalid");
}
Date goodsdate=goods.getGdate();
if(goodsdate!=null&&goodsdate.after((new Date()))){
errors.rejectValue("gdate","gdate.invalid");
}
}
}
2、控制器方法使用,可以在控制器方法代碼定義實例直接使用:validator.validate(goods,result);
@RequestMapping("/save")
public String save(Goods goods, BindingResult result, Model model){
validator.validate(goods,result);
if(result.hasErrors()){
model.addAttribute(goods);
return "addGoods";
}
goodsService.save(goods);
model.addAttribute("goodsList", goodsService.getGoods());
return "goodsList";
}
3、控制器使用,使用在整個控制器中,利用@InitBinder註解,配置該控制器的驗證器,不需要配置文件中處理,該方式需要hibernate-validator,進行註解驗證的時候會調用該驗證器,相當於在JSR303規範外自定義驗證
@InitBinder
public void initBinder(WebDataBinder binder){
// CustomDateEditor editor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true);
//// binder.registerCustomEditor(Date.class,editor);
binder.setValidator(new GoodsValidator());
}
@RequestMapping("/save") //定義的方法參數需要使用hibernate-validator的@Valid註解
public String save(@Valid Goods goods, BindingResult result, Model model){
//validator.validate(goods,result);
if(result.hasErrors()){
model.addAttribute(goods);
return "addGoods";
}
goodsService.save(goods);
model.addAttribute("goodsList", goodsService.getGoods());
return "goodsList";
}
4、項目使用,以上方法亦可以定義在SpringMVC的配置文件中,就不需要增加@InitBinder註解方法,整個項目可用該驗證,注:也可以使用WebBindingInitializer的initBinder方法來進行全局設定
<context:component-scan base-package="validator" />
<mvc:annotation-driven validator="goodsValidator"></mvc:annotation-driven>
@RequestMapping("/save") //定義的方法參數需要使用hibernate-validator的@Valid註解
public String save(@Valid Goods goods, BindingResult result, Model model){
//validator.validate(goods,result);
if(result.hasErrors()){
model.addAttribute(goods);
return "addGoods";
}
goodsService.save(goods);
model.addAttribute("goodsList", goodsService.getGoods());
return "goodsList";
}
5、直接使用hibernate-validator定義的註解:
JSR-303的校驗是基於註解的,它內部已經定義好了一系列的限制註解,我們只需要把這些註解標記在需要驗證的實體類的屬性上或是其對應的get方法上。
參考:https://www.cnblogs.com/afeng7882999/p/4300032.html
在spring3之後,任何支持JSR303的validator(如Hibernate Validator)都可以通過簡單配置引入,只需要在配置xml中加入mvc:annotation-driven,這時validatemessage的屬性文件默認爲classpath下的ValidationMessages.properties。
使用SpringMVC的時候我們只需要把JSR-303的實現者對應的jar包放到lib中,然後在SpringMVC的配置文件中引入MVC Namespace,並加上mvc:annotation-driven/就可以非常方便的使用JSR-303來進行實體對象的驗證。加上了mvc:annotation-driven/之後Spring會自動檢測classpath下的JSR-303提供者並自動啓用對JSR-303的支持,把對應的校驗錯誤信息放到Spring的Errors對象中
如下:引用hibernate-validator並交由SpringMVC自動配置validator後,可在項目中直接使用註解
<mvc:annotation-driven ></mvc:annotation-driven>
也可不用默認配置,自定義使用的validator和錯誤輸出文件,同樣可在項目中使用hibernate-validator提供的註解,如下:
<mvc:annotation-driven validator="validator" ></mvc:annotation-driven>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
<!--不設置則默認爲classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource"></property>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/resource/errorMessages"></property>
</bean>
使用:可在屬性或者get方法添加註解
@Range(min=0,max=100,message="{gprice.invalid}")
private double gprice;
@NotBlank(message = "{goods.gname.required}")
public String getGname() {
return gname;
}
@NotBlank(message = "描述不能爲空")
public String getGdescription() {
return gdescription;
}
驗證時候需要在方法入參添加@Valid註解,同時後面跟隨一個Error或者BindingResult對象接收錯誤信息,如下:
@RequestMapping("/save")
public String save(@Valid Goods goods, BindingResult result, Model model){
//validator.validate(goods,result);
if(result.hasErrors()){
model.addAttribute(goods);
return "addGoods";
}
goodsService.save(goods);
model.addAttribute("goodsList", goodsService.getGoods());
return "goodsList";
}
JSR提供的校驗註解
@Null 被註釋的元素必須爲 null
@NotNull 被註釋的元素必須不爲 null
@AssertTrue 被註釋的元素必須爲 true
@AssertFalse 被註釋的元素必須爲 false
@Min(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value) 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value) 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max=, min=) 被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction) 被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past 被註釋的元素必須是一個過去的日期
@Future 被註釋的元素必須是一個將來的日期
@Pattern(regex=,flag=) 被註釋的元素必須符合指定的正則表達式
Hibernate Validator提供的校驗註解
@NotBlank(message =) 驗證字符串非null,且長度必須大於0
@Email 被註釋的元素必須是電子郵箱地址
@Length(min=,max=) 被註釋的字符串的大小必須在指定的範圍內
@NotEmpty 被註釋的字符串的必須非空
@Range(min=,max=,message=) 被註釋的元素必須在合適的範圍內