SpringMVC Validator 验证器使用方法汇总,自定义validator及使用hibernate-validator

参考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=)  被注释的元素必须在合适的范围内

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC是一个用于构建Web应用程序的Java框架。它基于MVC(Model-View-Controller)设计模式,通过将应用程序分成不同的组件来实现松耦合和可维护性。 要使用Spring MVC,您需要进行以下步骤: 1. 引入Spring MVC依赖:在您的项目中添加Spring MVC依赖项,例如通过Maven或Gradle。 2. 配置DispatcherServlet:在web.xml或使用Servlet 3.0+的Java配置中,配置DispatcherServlet作为前端控制。DispatcherServlet将处理所有的HTTP请求,并将请求分发到适当的处理程序。 3. 配置处理程序映射:通过配置HandlerMapping,将URL映射到适当的处理程序(Controller)。 4. 创建控制:创建处理请求的控制类。控制使用注解(如@Controller)标记,并包含处理不同URL的方法。 5. 实现请求处理方法:在控制类中,实现各种请求处理方法。这些方法使用注解(如@RequestMapping)标记,并定义对应URL的逻辑。 6. 定义视图:在请求处理方法中,返回适当的视图名称。Spring MVC提供了各种视图解析,可以将视图名称解析为实际的视图。 7. 创建视图模板:根据视图解析的配置,创建相应的视图模板。这可以是JSP、Thymeleaf、Freemarker等。 8. 处理表单提交:使用Spring MVC的表单绑定功能,处理表单提交并验证用户输入。您可以使用注解(如@ModelAttribute)绑定表单数据到对象,并使用验证Validator)进行验证。 9. 处理异常:通过配置适当的异常处理,处理应用程序中的异常并返回适当的错误视图。 10. 配置其他组件:根据需要,配置其他Spring MVC组件,如拦截、文件上传等。 以上是使用Spring MVC的基本步骤。通过遵循这些步骤,您可以构建灵活、可维护的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值