springMVC与hibernate的验证接口(JSR-380)一起使用。
一般在开发中,数据验证是利用springMVC自带的验证接口与hibernate的验证接口(JSR-380)一起使用,实现一个效果完美的数据验证。
1.导入jar包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.1.0.Final</version>
</dependency>2.配置validator
<!-- 校验器 -->
<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>CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
</bean>
<!-- 全局异常处理器
只要实现HandlerExceptionResolver接口就是全局异常处理器-->
<bean class="cn.itcast.ssm.exception.CustomExceptionResolver"></bean>3.将validator加到处理器适配器
<!-- validator="validator"注入了校验器-->
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>4.添加验证规则
public class Items {
private Integer id;
//校验名称在1到30字符中间
//message是提示校验出错显示的信息
//groups:此校验属于哪个分组,groups可以定义多个分组(后面扩展)
@Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class})
private String name;
private Float price;
private String pic;
//非空校验
@NotNull(message="{items.createtime.isNUll}")
private Date createtime;5.错误消息文件
items.na
me.length.error=名称在10-30个字符之间 items.createtime.isNUll=请添加内容在项目的资源文件目录下添加一个错误日志文件xxxxxxx.properties
6.捕获错误controller编写
// 在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult
// bindingResult接收校验出错信息
// 注意:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。
// value={ValidGroup1.class}指定使用ValidGroup1分组的 校验
// @ModelAttribute可以指定pojo回显到页面在request中的key
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(
Model model,
HttpServletRequest request,
Integer id,
@ModelAttribute("items") @Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom,
BindingResult bindingResult,
MultipartFile items_pic//接收商品图片
) throws Exception {
// 获取校验错误信息
if (bindingResult.hasErrors()) {
// 输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
for (ObjectError objectError : allErrors) {
// 输出错误信息
System.out.println(objectError.getDefaultMessage());
}
// 将错误信息传到页面
model.addAttribute("allErrors", allErrors);
//可以直接使用model将提交pojo回显到页面
model.addAttribute("items", itemsCustom);
// 出错重新到商品修改页面
return "items/editItems";
}
注意:添加@Validated表示在对items参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边。
7.分组校验(扩展)
有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需要的,对于更新时是必须的,可以如下配置:
1. public class UserModel {
2.
3. @NotNull(message = "{id.empty}", groups = { First.class })
4. private int id;
5.
6. @NotNull(message = "{username.empty}", groups = { First.class, Second.class })
7. private String username;
8.
9. @NotNull(message = "{content.empty}", groups = { First.class, Second.class })
10. private String content;
11.
12. public int getId() {
13. return id;
14. }
15.
16. public void setId(int id) {
17. this.id = id;
18. }
19.
20. public String getUsername() {
21. return username;
22. }
23.
24. public void setUsername(String username) {
25. this.username = username;
26. }
27.
28. public String getContent() {
29. return content;
30. }
31.
32. public void setContent(String content) {
33. this.content = content;
34. }
35. }
36. public interface First {
37. }
38.
39. public interface Second {
40. }
通过 groups 对验证进行分组
在controler中的代码如下:
1. @RequestMapping(value = "/save.action", method = RequestMethod.POST)
2. public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) {
3. if (result.hasErrors()) {
4. return "validate/error";
5. }
6. return "redirect:/success";
7. }
8.
9. @RequestMapping(value = "/update.action", method = RequestMethod.POST)
10. public String update(@Validated( { First.class, Second.class }) UserModel user, BindingResult result) {
11. if (result.hasErrors()) {
12. return "validate/error";
13. }
14. return "redirect:/success";
15. }
8.校验注解
@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 附加的 constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内