SpringMVC进行请求数据校验

来源:互联网 发布:urllib post json 编辑:程序博客网 时间:2024/06/08 02:23

SpringMVC使用JSR-303校验规范,@Valid JSR-303是javaEE6的规范。

SpringMVC具体使用hibernate-validator校验框架(和hibernate的ORM没有关系),基于的bean的属性校验。*

1.引入依赖

项目引入jar包:

validation-api-1.0.0.GA.jar:JDK的接口;

hibernate-validator-4.2.0.Final.jar是对上述接口的实现;

log4j、slf4j、slf4j-log4j

或者maven方式加入jar依赖

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.2.4.Final</version></dependency><!-- http://mvnrepository.com/artifact/javax.validation/validation-api --><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency>

 

2. 配置校验器

  在spring-mvc.xml配置文件中配置一下校验器,如下:

<!-- 配置校验器 --><bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">    <!-- 校验器,使用hibernate校验器 -->    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>    <!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->    <property name="validationMessageSource" ref="messageSource"/></bean><!-- 校验错误信息配置文件 --><bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">    <!-- 资源文件名 -->    <property name="basenames">        <list>            <value>classpath:CustomValidationMessage</value>        </list>    </property>    <!-- 资源文件编码格式 -->    <property name="fileEncodings" value="utf-8"/>    <!-- 对资源文件内容缓存时间,单位秒 -->    <property name="cacheSeconds" value="120"/></bean>

 

注意:在idea下开发有可能会报classpath:CustomValidationMessage不存在但是不影响开发

  配置规则就是bean和property属性,别把class和文件名写错了就行,这里有个配置是资源文件名,这个文件中我们将会配置一些错误信息。配置好了校验器后,需要将校验器注入到处理器适配器中,还是在springmvc.xml文件中,将我们配好的validator注入进去,如下:

<mvc:annotation-driven conversion-service="conversion-service" validator="validator"/>

这样校验器就配置好了。

1.1注解用法:

1) 可用的 JSR303注解hibernate校验框架提供了很多注解校验,我先简单罗列一下:

注解运行时检查@AssertFalse被注解的元素必须为false@AssertTrue被注解的元素必须为true@DecimalMax(value)被注解的元素必须为一个数字,其值必须小于等于指定的最小值@DecimalMin(Value)被注解的元素必须为一个数字,其值必须大于等于指定的最小值@Digits(integer=, fraction=)被注解的元素必须为一个数字,其值必须在可接受的范围内@Future被注解的元素必须是日期,检查给定的日期是否比现在晚@Max(value)被注解的元素必须为一个数字,其值必须小于等于指定的最小值@Min(value)被注解的元素必须为一个数字,其值必须大于等于指定的最小值@NotNull被注解的元素必须不为null@Null被注解的元素必须为null@Past(java.util.Date/Calendar)被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早@Pattern(regex=, flag=)被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配@Size(min=, max=)被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays)@Valid递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验@CreditCardNumber对信用卡号进行一个大致的验证@Email被注释的元素必须是电子邮箱地址@Length(min=, max=)被注解的对象必须是字符串的大小必须在制定的范围内@NotBlank被注解的对象必须为字符串,不能为空,检查时会将空格忽略@NotEmpty被注释的对象必须为空(数据:String,Collection,Map,arrays)@Range(min=, max=)被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 )@URL(protocol=, host=, port=, regexp=, flags=)被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

  上面罗列了一些校验的注解,如何使用这个hibernate验证框架。首先在自己的pojo中需要验证的属性上添加相应的验证注解:(可以添加多个注解验证)

@NotNull(message = "{common.orderNo.not.empty}")@Length(min = 0, max = 21, message = "{common.orderNo.length.error}")private String orderNo;//商户订单号@NotNull(message="名字不能为空")private String userName;@Max(value=120,message="年龄最大不能查过120") privateint age; @Email(message="邮箱格式错误") private String email;

 

 

  我们看到注解中可以指定message,那么这个message中的内容是错误消息配置文件中对应的key,取出来的就是对应的错误消息,所以针对这两个错误消息,我们写一下配置文件:

##CustomValidationMessage.propertiescommon.reqMsgId.not.empty=参数reqMsgId不能为空!common.oriReqMsgId.not.empty=参数oriReqMsgId不能为空!

4. 捕获校验错误信息

  上面已经将校验相关的配置都配好了,接下来就需要在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示。那么controller的方法中该如何去捕获呢?如下:

@RequestMapping("/login")    public String testValid(@Valid User user, BindingResult result){        if (result.hasErrors()){            List<ObjectError> errorList = result.getAllErrors();                  StringBuffer errorMessage = new StringBuffer();            for(ObjectError error : errorList){                String strError = new String(error.getDefaultMessage().getBytes("UTF-8"), "UTF-8");//把返回错误的提示再次编码                errorMessage.append(strError);                errorMessage.append(";");                System.out.println(errorMessage.toString());            }        }        return "test";    }

 

  在需要校验的pojo前边添加@Validated或者@Valid,在需要校验的pojo后边添加BindingResult bindingResult来接收校验出错信息。值得注意的是:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。这样就可以顺利接收到错误信息了,否则spring会在校验不通过时直接抛出异常。

0 0
原创粉丝点击