参考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
参考2:https://blog.csdn.net/long316/article/details/82114189
在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=) 被注释的元素必须在合适的范围内