定递归验证关联的对象可以用于继承对象吗 spring validate

 我来答
该问答中所提及的号码未经验证,请注意甄别。
zs...u@163.com
2017-07-12 · TA获得超过135个赞
知道答主
回答量:362
采纳率:0%
帮助的人:115万
展开全部
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注解也不会校验
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式