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会在校验不通过时直接抛出异常。
- SpringMVC进行请求数据校验
- springmvc 使用JSR-303进行数据校验
- springmvc 使用JSR-303进行数据校验
- ofbiz 使用迷你语言对请求数据进行校验
- springmvc的数据校验
- SpringMVC 数据校验
- SpringMVC 数据校验
- SpringMVC的数据校验
- SpringMVC数据校验
- SpringMVC数据校验
- springmvc中的数据校验
- SpringMVC数据校验
- SpringMVC的数据校验
- SpringMVC数据校验
- SpringMVC数据校验(三)
- springmvc数据校验
- 三.SpringMVC 数据校验
- SpringMVC中的数据校验
- java 判断字符串中是否有重复字符
- 【Codeforces Round #403】Codeforces 781A Andryusha and Colored Balloons
- 根据红黑树的算法来分析TreeMap的实现
- 面经总结
- 服务架构及单点故障导致系统雪崩探讨
- SpringMVC进行请求数据校验
- 异步处理(Handler)线程(Thread&Runnable)定时器(Timer)Wifi管理(WifiManager&WifiInfo)
- Redis的INCR方法
- c语言问题
- Android开发者福利之--------Android 6.0 API
- Android中TextView的富文本显示
- 设计模式 状态模式 以自动售货机为例
- 面经2
- Dubbo架构设计详解