Spring数据校验

来源:互联网 发布:狼雨seo网站排名 编辑:程序博客网 时间:2024/06/09 18:30

Spring数据校验

spring拥有自己独立的数据校验框架,同时支持JSR303标注校验。springDataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。在spring mvc中则可直接通过注解驱动的方式进行数据校验

 

Validator校验接口

boolean supports(Class<?> clazz):该校验器能够对clazz类型的对象进行校验

void validate(Object target,Errors errors):对目标对象进行校验,并将校验错误记录到errors

 

LocalValidatorFactoryBean

LocalValidatorFactoryBean既实现了spring的validator接口,也实现了JSR303的Validator接口。只要在spring 容器中定义一个LocalValidatorFactoryBean,即可将其注入到需要校验的Bean中。

<bean id="validator"

         class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

 

Spring mvc数据校验

<mvc:annotation-driven>会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid注解即可让spring mvc执行数据校验工作。

public String handle91(@Valid @ModelAttribute(“user”)Useruser,BindingResult bindingResult){

         if(bingingResult.hasErrors){

                   return“/user/register”;

}

return “/user/showUser”

}

将入参对象添加@Valid注解,同时紧跟其后声明一个BindingResult的入参,根据BingingResult即可判断是否存在错误。绑定接口既可以是BindingResult也可以Errors类型

 

在页面显示错误

spring mvc除了会将表单/命令对象的校验结果保存在对应的BindingResult或Errors中,还会将所有校验结果保存到隐含模型中,也就是说即使处理方法的签名没有对应于表单/命令对象的校验结果入参,校验结果也不会丢失,它们始终可以在隐含模型中获取。隐含模型中所有数据最终通过HttpServletRequest的属性列表暴露给JSP视图对象。

 

通过国际化资源显示错误信息

每个属性在数据绑定和数据校验发生错误时,都会产生一个对应的FieldError对象,FieldError实现了org.springframework.context.MessageSourceResolvable接口。MessageSourceResolvable是可用国际化资源进行解析对象。

MessageSourceResolvable提供3个接口

Object getArguments():返回一组参数对象

String[] getCodes():返回一组消息代码,每个代码对应一个资源属性,可以使用getArguments()返回的参数对资源属性进行参数替换

String getDefaultMessage():默认消息

当一个属性校验失败后,校验框架会为该属性生成4个消息代码,这些代码以校验注解类名为前缀,结合类名、属性名、属性类型名生成多个消息代码

如User类的password属性标注了一个@Pattern的注解,当校验失败后会产生如下4个错误代码

Parttern.user.password

Parttern.password

Parttern.java.lang.String

Parttern

当使用Sprng mvc标签显示错误信息时,Spring mvc查看web上下文是否装配了对应国际化消息,如果没有,则显示默认的错误消息,否则使用国际化消息对错误代码进行翻译。

 

如果在数据类型转换或数据类型格式时发生错误,或者该有的参数不存在,或者调用处理方法时发生错误,都会在隐含模型中创建错误消息,其错误代码前缀说明如下:

required:必要的参数不存在,如@RequestParam(“param1”)标注了一个入参,当请求参数不存在时

typeMismatch:在数据绑定时发生数据类型不匹配

methodInvocation:spring mvc在调用方法时发生错误

示例

如果”aaa”非数字参数传递给User的salary属性,将发生数据转换的错误,Spring将为该错误生成如下错误代码

typeMismatch.user.salary

typeMismatch.salary

typeMismatch.long

typMismatch

 

装配国际化资源

<bean id="messageSource"

         class="org.springframework.context.support.ResourceBundleMessageSource">

<propertyname="basename">

<value>conf/i18n/messages</value>

</property>

</bean>

也可以通过basenames属性指定多个国际化资源

在conf/i18n下添加基名为messages的国际化资源,一个默认的messages.properties,另一个对应messages_zh_CN.properties

 

自定义校验规则

通过@InitBinder注解的initBinder方法中装配自定义MyValidator

@InitBinder

public void initBinder(WebDataBinder binder){

         binder.setValidtor(newXXX());//在进行数据绑定时使用的校验器

}

也可以借助请求处理方法的签名传递一个Errors或BindingResult对象进来,然后在处理方法中直接校验。

public String handle92(@ModelAttribute(“user”Useruser,BindingResult bindingResult)){

         ValidationUtils.rejectIfEmptyOrWritespace(bindingResult,”username”,”required”);

         //产生的错误信息对象错误代码包括

         //required.user.username

// required.username

// required.java.lang.String

// required

         if(“aaa”.equalsIgnoreCase(user.getUsername())){

                   bindingResult.rejectValue(“username”,”reserved”);

                   //产生的错误代码如下

                   //reserved.user.username

// reserved.username

// reserved.java.lang.String

// reserved

}

if(bindingResult.hasErrors()){

         return “/user/register4”;

}else{

         return “/user/showUser”;

}

}

binder.setValidator()方法设置自定义的Validtor后,spring mvc将使用它对入参进行校验,将不在使用spring mvc框架装配的Validator对入参对象进行校验,即使入参标注了@Valid注解也不会校验

0 0