SpringMVC提供了自定校验器的接口,自定义校验器我们选用Hibernate的校验器,虽然有Hibernate,但是和Hibernate没任何关系。
1、我们要导入校验器的包:
2、在SpringMVC提供的校验接口中注入自定义校验器,并且配置校验错误信息文件的路径
<!-- 添加自定义校验器 -->
<!-- spring提供的一个自定义校验器接口 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器提供类,,这里使用hibernate的校验 -->
<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="basenames">
<list>
<value>classpath:ClassValidationMessage</value>
</list>
</property>
<property name="fileEncodings" value="utf-8"></property>
<!-- 对资源文件缓存内容时间 -->
<property name="cacheSeconds" value="120"></property>
</bean>
因为我们的Controller是有处理器适配器进行调用,所以在注解驱动中注入自定义校验
<!-- 配置扫描驱动 -->
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
3、在需要进行校验的javaBean中通过注解来设置校验规则
public class Class
{
@NotNull(message = "{class.id.error}")
private Integer id;
// 添加校验
// 这里的message就是提示校验出错显示的信息
@Size(min = 1, max = 30, message = "{class.name.length.error}")
private String name;
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name == null ? null : name.trim();
}
}
其中message中的键值和properties中的键值相对应。
4、我们要在controller中的方法中,对需要进行校验的pojo进行注解
@RequestMapping("/pushClass")
// 在你需要校验的pojo的前面添加@Validated,后面添加BindingResult bindingResult接受错误校验信息
// @Validated和BindingResult bindingResult是成对出现的,并且顺序是固定的
public void pushClass(Model model, @Validated
StuClass stuClass, BindingResult bindingResult)
{
// 如果有错误信息
if (bindingResult.hasErrors())
{
// 输出错误信息
List<ObjectError> lists = bindingResult.getAllErrors();
for (ObjectError objectError : lists)
{
System.out.println(objectError.getDefaultMessage());
}
// 准备将错误信息传入到页面
model.addAttribute("allErrors", lists);
// 出错直接结束
return;
}
Class c = new Class();
c.setName("销售班");
classService.insert(c);
}
并在方法中对错误信息进行判断,且将错误信息传入到前台。。。。
问题:如果我某个controller方法中只想对class类中的name长度进行校验,不对id进行非空校验怎么办呢?
针对这个问题,SpringMVC提供了分组校验
1、定义一个接口,该接口不实现任何方法,仅仅表示校验的一个分组
public interface ValidationGroup1
{
// 接口不需要实现任何方法,仅表示对不同规则的校验进行分组
// 例如,此接口表示仅对Class中的name的长度进行校验,不需要对id进行非空校验
}
2、在class中的校验注解标签中添加一个group字段
// 添加校验
// 这里的message就是提示校验出错显示的信息
// Group表示此校验属于哪个分组,可以有多个分组
@Size(min = 1, max = 30, message = "{class.name.length.error}", groups =
{
ValidationGroup1.class
})
3、在controller方法中,要在校验标签中添加value属性值
// 在你需要校验的pojo的前面添加@Validated,后面添加BindingResult bindingResult接受错误校验信息
// @Validated和BindingResult bindingResult是成对出现的,并且顺序是固定的
// @Validated(value = ValidationGroup1.class)表示指定分组ValidationGroup1进行校验
public void pushClass(Model model, @Validated(value = ValidationGroup1.class)
StuClass stuClass, BindingResult bindingResult)
{
// 如果有错误信息
if (bindingResult.hasErrors())
{
// 输出错误信息
List<ObjectError> lists = bindingResult.getAllErrors();
for (ObjectError objectError : lists)
{
System.out.println(objectError.getDefaultMessage());
}
// 准备将错误信息传入到页面
model.addAttribute("allErrors", lists);
// 出错直接结束
return;
}
Class c = new Class();
c.setName("销售班");
classService.insert(c);
}