最新没事写下springmvc中的服务端数据校验,springmvc采用了hibernate的校验框架进行校验,当然这个hibernate没有半毛钱关系首先在实际开发中,通常使用较多是前端的校验,比如页面中js校验,对于安全性要求较高的建议在前端和服务端都进行验证。服务端校验可以是在控制(controller)层也可以是在业务(service)层,控制层校验页面请求的参数的合法性,在服务端控制层的校验,不区分客户端类型(浏览器、手机客户端、远程调用等),服务层主要校验关键业务参数,仅限于service接口中使用的参数。下来写下如何使用
1、MAVEN添加依赖包
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.3.2.Final</version> </dependency> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.1.0.CR2</version> </dependency>
2、配置校验器
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator" /> <property name="validationMessageSource" ref="messageSource" /> </bean> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames"> <list> <!--这里可以自己定义也可以使用系统的--> <!-- <value>classpath:org/hibernate/validator/ValidationMessages</value> --> <value>classpath:MyValidationMessages</value> </list> </property> <property name="useCodeAsDefaultMessage" value="false"/> <!---编码格式--> <property name="defaultEncoding" value="UTF-8"/> <!---缓存时间 单位是毫秒--> <property name="cacheSeconds" value="60"/> </bean>
3、将校验器注入的处理器适配器中
<!-- 会自动注册了validator ConversionService--> <mvc:annotation-driven validator="validator" conversion-service="conversion-service" />
4、pojo中添加校验规则
public class Account { //长度最少为2 最大为5 @Size(min=2,max=5,message="{account.id.length.error}") private String id; //不允许为空 @NotBlank(message="{account.name.isblank}") private String name;
....
5、添加自己的提示文件(创建MyValidationMessages.properties)
6、获取校验信息
@ResponseBody @RequestMapping(value="/saveOrUpdate") public String saveOrUpdate(@Validated Account account,BindingResult bindingResult){ StringBuffer sb = new StringBuffer(); if(bindingResult.hasErrors()){ List<ObjectError> errors =bindingResult.getAllErrors(); for (ObjectError objectError : errors) { sb.append(objectError.getDefaultMessage()); } return JSON.toJSONString(sb); } }
6、分组校验
根据需要创建N个ValidationGroupBase.class用于分组
@ResponseBody @RequestMapping(value="/saveOrUpdate") public String saveOrUpdate(@Validated(value={ValidationGroupBase.class}) Account account,BindingResult bindingResult){ StringBuffer sb = new StringBuffer(); if(bindingResult.hasErrors()){ String isd; List<ObjectError> errors =bindingResult.getAllErrors(); for (ObjectError objectError : errors) { sb.append(objectError.getDefaultMessage()); } return JSON.toJSONString(sb); } }
public class Account { //长度最少为2 最大为5 @Size(min=2,max=5,groups={ValidationGroupBase.class},message="{account.id.error}") private String id; //不允许为空 @NotBlank(message="{account.name.isblank}") private String name; }